ith5 2 maanden geleden
bovenliggende
commit
ac2bdf6ae8
1 gewijzigde bestanden met toevoegingen van 330 en 140 verwijderingen
  1. 330 140
      app/v1/logic/dataReport/AnalyseLogic.php

+ 330 - 140
app/v1/logic/dataReport/AnalyseLogic.php

@@ -830,160 +830,350 @@ class AnalyseLogic extends BaseLogic
     public function getPaySuccessRate($where)
     {
         $params = $this->searchByAuth($where);
-      
         $whereRaw = $this->getCommonWhereRaw($params);
-        
         $type = $params['type'] ?? 'day';
 
+        if ($type == 'day') {
+            return $this->getPaySuccessRateByDay($whereRaw);
+        } elseif ($type == 'week') {
+            return $this->getPaySuccessRateByWeek($whereRaw);
+        }
 
-        // 对比今日和昨日的支付成功率,
-        if($type == 'day'){
-            $today = date('Y-m-d');
-            $yesterday = date('Y-m-d', strtotime('-1 day'));
-            $todayWhereRaw = $whereRaw . " AND pay_time BETWEEN '".strtotime($today . " 00:00:00")."' AND '".strtotime($today . " 23:59:59")."'";
-            $yesterdayWhereRaw = $whereRaw . " AND pay_time BETWEEN '".strtotime($yesterday . " 00:00:00")."' AND '".strtotime($yesterday . " 23:59:59")."'";
-
-
-            // 今日总下单量
-            $todayOrderNumData = Db::connect('db_game_log')->query("
-                SELECT Count(*) as order_num, pay_time
-                FROM sdk_order_success
-                WHERE {$todayWhereRaw}
-                group by pay_time
-            ");
-
-            // 今日总支付量
-            $todayPaySuccessData = Db::connect('db_game_log')->query("
-                SELECT Count(*) as pay_num, pay_time
-                FROM sdk_order_success
-                WHERE {$todayWhereRaw} AND sync_status = 1
-                group by pay_time
-            ");
-            
-            // 初始化24小时的数组(0-23)
-            $todayOrderNumDataMap = [];
-            $todayPaySuccessDataMap = [];
-            for ($hour = 0; $hour < 24; $hour++) {
-                $hourKey = str_pad($hour, 2, '0', STR_PAD_LEFT);
-                $todayOrderNumDataMap[$hourKey] = 0;
-                $todayPaySuccessDataMap[$hourKey] = 0;
-            }
-            
-            // 新总下单量按小时分组
-            foreach($todayOrderNumData as $item){
-                $hourKey = date('H', $item['pay_time']);
-                $todayOrderNumDataMap[$hourKey] = $item['order_num'];
-            }
-            // 新总支付量按小时分组
-            foreach($todayPaySuccessData as $item){
-                $hourKey = date('H', $item['pay_time']);
-                $todayPaySuccessDataMap[$hourKey] = $item['pay_num'];
-            }
+        return [];
+    }
 
-            // 计算今日支付成功率
-            $todayPaySuccessRateArr = [];
-            foreach($todayOrderNumDataMap as $key => $value){
-                $paySuccessNum = $todayPaySuccessDataMap[$key] ?? 0;
-                $todayPaySuccessRateArr[] = $value > 0 ? getRound($paySuccessNum, $value) : 0;
-            }
-            
-
-
-            // 昨日总下单量
-            $yesterdayOrderNumData = Db::connect('db_game_log')->query("
-                SELECT Count(*) as order_num, pay_time
-                FROM sdk_order_success
-                WHERE {$yesterdayWhereRaw}
-                group by pay_time
-            ");
-            
-            
-            // 昨日总支付量
-            $yesterdayPaySuccessData = Db::connect('db_game_log')->query("
-                SELECT Count(*) as pay_num, pay_time
-                FROM sdk_order_success
-                WHERE {$yesterdayWhereRaw} AND sync_status = 1
-                group by pay_time
-            ");
-
-            // 初始化24小时的数组(0-23)
-            $yesterdayOrderNumDataMap = [];
-            $yesterdayPaySuccessDataMap = [];
-            for ($hour = 0; $hour < 24; $hour++) {
-                $hourKey = str_pad($hour, 2, '0', STR_PAD_LEFT);
-                $yesterdayOrderNumDataMap[$hourKey] = 0;
-                $yesterdayPaySuccessDataMap[$hourKey] = 0;
-            }
-            
-            // 昨日总下单量按小时分组
-            foreach($yesterdayOrderNumData as $item){
-                $hourKey = date('H', $item['pay_time']);
-                $yesterdayOrderNumDataMap[$hourKey] = $item['order_num'];
-            }
-            // 昨日总支付量按小时分组
-            foreach($yesterdayPaySuccessData as $item){
-                $hourKey = date('H', $item['pay_time']);
-                $yesterdayPaySuccessDataMap[$hourKey] = $item['pay_num'];
-            }
+    /**
+     * 按天对比支付成功率(今天vs昨天,按小时分组)
+     */
+    private function getPaySuccessRateByDay($whereRaw)
+    {
+        $today = date('Y-m-d');
+        $yesterday = date('Y-m-d', strtotime('-1 day'));
+        
+        $currentStartTime = strtotime($today . " 00:00:00");
+        $currentEndTime = strtotime($today . " 23:59:59");
+        $lastStartTime = strtotime($yesterday . " 00:00:00");
+        $lastEndTime = strtotime($yesterday . " 23:59:59");
+
+        // 获取当前周期和上一周期的数据
+        $currentData = $this->getPayDataByTimeRange($whereRaw, $currentStartTime, $currentEndTime);
+        $lastData = $this->getPayDataByTimeRange($whereRaw, $lastStartTime, $lastEndTime);
+
+        // 初始化24小时数据
+        $currentOrderMap = $this->initHourlyData();
+        $currentPayMap = $this->initHourlyData();
+        $lastOrderMap = $this->initHourlyData();
+        $lastPayMap = $this->initHourlyData();
+
+        // 填充数据(按小时)
+        $this->fillDataByHour($currentData['orderData'], $currentOrderMap);
+        $this->fillDataByHour($currentData['payData'], $currentPayMap);
+        $this->fillDataByHour($lastData['orderData'], $lastOrderMap);
+        $this->fillDataByHour($lastData['payData'], $lastPayMap);
+
+        // 计算成功率
+        $currentRateArr = $this->calculateSuccessRate($currentOrderMap, $currentPayMap);
+        $lastRateArr = $this->calculateSuccessRate($lastOrderMap, $lastPayMap);
+
+        // 生成X轴数据(小时)
+        $xAxisData = $this->generateHourlyXAxisData();
+
+        // 计算成功率变化
+        $successRateChange = $this->calculateRateChange($currentRateArr, $lastRateArr);
+
+        // 生成表格数据
+        $tableData = $this->generateDayTableData(
+            $currentOrderMap, 
+            $currentPayMap, 
+            $currentRateArr,
+            $lastOrderMap, 
+            $lastPayMap, 
+            $lastRateArr,
+            $successRateChange
+        );
+
+        $currentOrderNum = array_sum($currentOrderMap);
+        $currentPaySuccessNum = array_sum($currentPayMap);
+        $paySuccessRate = $currentOrderNum > 0 ? getRound($currentPaySuccessNum, $currentOrderNum) : 0;
 
-            // 计算昨日支付成功率
-            $yesterdayPaySuccessRateArr = [];
-            foreach($yesterdayOrderNumDataMap as $key => $value){
-                $paySuccessNum = $yesterdayPaySuccessDataMap[$key] ?? 0;
-                $yesterdayPaySuccessRateArr[] = $value > 0 ? getRound($paySuccessNum, $value) : 0;
-            }
+        return [
+            'PaySuccessRateArr' => $currentRateArr,
+            'OldPaySuccessRateArr' => $lastRateArr,
+            'orderNum' => $currentOrderNum,
+            'successNum' => $currentPaySuccessNum,
+            'paySuccessRate' => $paySuccessRate,
+            'xAxisData' => $xAxisData,
+            'successRateChange' => $successRateChange,
+            'data' => $tableData
+        ];
+    }
 
-            // 今日总下单量
-            $todayOrderNum = array_sum($todayOrderNumDataMap);
-            // 今日支付成功量
-            $todayPaySuccessNum = array_sum($todayPaySuccessDataMap);
-            // 今日支付成功率
-            $paySuccessRate = getRound($todayPaySuccessNum, $todayOrderNum);
-            // xAxis.data
-            $xAxisData = [];
-            for ($hour = 0; $hour < 24; $hour++) {
-                $xAxisData[] = str_pad($hour, 2, '0', STR_PAD_LEFT) . ":00-" . str_pad($hour + 1, 2, '0', STR_PAD_LEFT) . ":00";
-                if($hour == 23){
-                    $xAxisData[] = str_pad($hour, 2, '0', STR_PAD_LEFT) . ":00-00:00";
-                }
-            }
-           
-            // 成功率变化
-            $successRateChange = [];
-            for ($hour = 0; $hour < 24; $hour++) {
-                $successRateChange[] = $todayPaySuccessRateArr[$hour] - $yesterdayPaySuccessRateArr[$hour];
-            }
+    /**
+     * 按周对比支付成功率(本周vs上周,按天分组)
+     */
+    private function getPaySuccessRateByWeek($whereRaw)
+    {
+        // 本周:今天往前7天(包含今天)
+        $currentEndTime = strtotime(date('Y-m-d') . " 23:59:59");
+        $currentStartTime = strtotime(date('Y-m-d', strtotime('-6 days')) . " 00:00:00");
+        
+        // 上周:今天往前14天到往前7天
+        $lastEndTime = strtotime(date('Y-m-d', strtotime('-7 days')) . " 23:59:59");
+        $lastStartTime = strtotime(date('Y-m-d', strtotime('-13 days')) . " 00:00:00");
+
+        // 获取当前周期和上一周期的数据
+        $currentData = $this->getPayDataByTimeRange($whereRaw, $currentStartTime, $currentEndTime);
+        $lastData = $this->getPayDataByTimeRange($whereRaw, $lastStartTime, $lastEndTime);
+
+        // 初始化7天数据
+        $currentOrderMap = $this->initWeeklyData($currentStartTime);
+        $currentPayMap = $this->initWeeklyData($currentStartTime);
+        $lastOrderMap = $this->initWeeklyData($lastStartTime);
+        $lastPayMap = $this->initWeeklyData($lastStartTime);
+
+        // 填充数据(按天)
+        $this->fillDataByDay($currentData['orderData'], $currentOrderMap);
+        $this->fillDataByDay($currentData['payData'], $currentPayMap);
+        $this->fillDataByDay($lastData['orderData'], $lastOrderMap);
+        $this->fillDataByDay($lastData['payData'], $lastPayMap);
+
+        // 计算成功率
+        $currentRateArr = $this->calculateSuccessRate($currentOrderMap, $currentPayMap);
+        $lastRateArr = $this->calculateSuccessRate($lastOrderMap, $lastPayMap);
+
+        // 生成X轴数据(星期)
+        $xAxisData = $this->generateWeeklyXAxisData($currentStartTime);
+
+        // 计算成功率变化
+        $successRateChange = $this->calculateRateChange($currentRateArr, $lastRateArr);
+
+        // 生成表格数据
+        $tableData = $this->generateWeekTableData(
+            $currentOrderMap,
+            $currentPayMap,
+            $currentRateArr,
+            $lastOrderMap,
+            $lastPayMap,
+            $lastRateArr,
+            $successRateChange,
+            $xAxisData
+        );
+
+        $currentOrderNum = array_sum($currentOrderMap);
+        $currentPaySuccessNum = array_sum($currentPayMap);
+        $paySuccessRate = $currentOrderNum > 0 ? getRound($currentPaySuccessNum, $currentOrderNum) : 0;
+
+        return [
+            'PaySuccessRateArr' => $currentRateArr,
+            'OldPaySuccessRateArr' => $lastRateArr,
+            'orderNum' => $currentOrderNum,
+            'successNum' => $currentPaySuccessNum,
+            'paySuccessRate' => $paySuccessRate,
+            'xAxisData' => $xAxisData,
+            'successRateChange' => $successRateChange,
+            'data' => $tableData
+        ];
+    }
+
+    /**
+     * 获取指定时间范围内的订单和支付数据
+     */
+    private function getPayDataByTimeRange($whereRaw, $startTime, $endTime)
+    {
+        $timeWhereRaw = $whereRaw . " AND pay_time BETWEEN '{$startTime}' AND '{$endTime}'";
+
+        // 总下单量
+        $orderData = Db::connect('db_game_log')->query("
+            SELECT Count(*) as order_num, pay_time
+            FROM sdk_order_success
+            WHERE {$timeWhereRaw}
+            GROUP BY pay_time
+        ");
+
+        // 总支付量
+        $payData = Db::connect('db_game_log')->query("
+            SELECT Count(*) as pay_num, pay_time
+            FROM sdk_order_success
+            WHERE {$timeWhereRaw} AND sync_status = 1
+            GROUP BY pay_time
+        ");
+
+        return [
+            'orderData' => $orderData,
+            'payData' => $payData
+        ];
+    }
+
+    /**
+     * 初始化24小时数据结构
+     */
+    private function initHourlyData()
+    {
+        $data = [];
+        for ($hour = 0; $hour < 24; $hour++) {
+            $hourKey = str_pad($hour, 2, '0', STR_PAD_LEFT);
+            $data[$hourKey] = 0;
+        }
+        return $data;
+    }
+
+    /**
+     * 初始化7天数据结构
+     */
+    private function initWeeklyData($startTime)
+    {
+        $data = [];
+        for ($day = 0; $day < 7; $day++) {
+            $dateKey = date('Y-m-d', strtotime("+{$day} days", $startTime));
+            $data[$dateKey] = 0;
+        }
+        return $data;
+    }
 
+    /**
+     * 按小时填充数据
+     */
+    private function fillDataByHour($sourceData, &$targetMap)
+    {
+        foreach ($sourceData as $item) {
+            $hourKey = date('H', $item['pay_time']);
+            $value = $item['order_num'] ?? $item['pay_num'] ?? 0;
+            $targetMap[$hourKey] = $value;
+        }
+    }
 
-            //表格数据
-            $tableData = [];
-            for ($hour = 0; $hour < 24; $hour++) {
-                $hourKey = str_pad($hour, 2, '0', STR_PAD_LEFT);
-                $tableData[] = [
-                    'time'=>$hourKey . ":00-" . str_pad($hour + 1, 2, '0', STR_PAD_LEFT) . ":00",
-                    'todayOrderNum'=>$todayOrderNumDataMap[$hourKey],
-                    'todayPayNum'=>$todayPaySuccessDataMap[$hourKey],
-                    'todayPaySuccessRate'=>$todayPaySuccessRateArr[$hour],
-                    'yesterdayOrderNum'=>$yesterdayOrderNumDataMap[$hourKey],
-                    'yesterdayPayNum'=>$yesterdayPaySuccessDataMap[$hourKey],
-                    'yesterdayPaySuccessRate'=>$yesterdayPaySuccessRateArr[$hour],
-                    'successRateChange'=>$successRateChange[$hour],
-                ];
+    /**
+     * 按天填充数据
+     */
+    private function fillDataByDay($sourceData, &$targetMap)
+    {
+        foreach ($sourceData as $item) {
+            $dateKey = date('Y-m-d', $item['pay_time']);
+            $value = $item['order_num'] ?? $item['pay_num'] ?? 0;
+            if (isset($targetMap[$dateKey])) {
+                $targetMap[$dateKey] += $value;
             }
+        }
+    }
 
+    /**
+     * 计算成功率数组
+     */
+    private function calculateSuccessRate($orderMap, $payMap)
+    {
+        $rateArr = [];
+        foreach ($orderMap as $key => $orderNum) {
+            $payNum = $payMap[$key] ?? 0;
+            $rateArr[] = $orderNum > 0 ? getRound($payNum, $orderNum) : 0;
+        }
+        return $rateArr;
+    }
 
+    /**
+     * 计算成功率变化
+     */
+    private function calculateRateChange($currentRateArr, $lastRateArr)
+    {
+        $change = [];
+        $count = count($currentRateArr);
+        for ($i = 0; $i < $count; $i++) {
+            $change[] = $currentRateArr[$i] - $lastRateArr[$i];
         }
+        return $change;
+    }
 
+    /**
+     * 生成小时X轴数据
+     */
+    private function generateHourlyXAxisData()
+    {
+        $xAxisData = [];
+        for ($hour = 0; $hour < 24; $hour++) {
+            $xAxisData[] = str_pad($hour, 2, '0', STR_PAD_LEFT) . ":00-" . 
+                          str_pad($hour + 1, 2, '0', STR_PAD_LEFT) . ":00";
+        }
+        return $xAxisData;
+    }
 
-        return [
-            'PaySuccessRateArr' => $todayPaySuccessRateArr,
-            'OldPaySuccessRateArr' => $yesterdayPaySuccessRateArr,
-            'orderNum'=>$todayOrderNum,
-            'successNum'=>$todayPaySuccessNum,
-            'paySuccessRate'=>$paySuccessRate,
-            'xAxisData'=>$xAxisData,
-            'successRateChange'=>$successRateChange,
-            'tableData'=>$tableData
-        ];
+    /**
+     * 生成星期X轴数据(根据起始日期往后推7天)
+     */
+    private function generateWeeklyXAxisData($startTime)
+    {
+        $weekDays = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];
+        $xAxisData = [];
+        
+        for ($day = 0; $day < 7; $day++) {
+            $timestamp = strtotime("+{$day} days", $startTime);
+            $weekIndex = date('w', $timestamp);
+            $xAxisData[] = $weekDays[$weekIndex];
+        }
+        
+        return $xAxisData;
+    }
+
+    /**
+     * 生成按天的表格数据
+     */
+    private function generateDayTableData(
+        $currentOrderMap, 
+        $currentPayMap, 
+        $currentRateArr,
+        $lastOrderMap, 
+        $lastPayMap, 
+        $lastRateArr,
+        $successRateChange
+    ) {
+        $tableData = [];
+        $index = 0;
+        
+        foreach ($currentOrderMap as $hourKey => $orderNum) {
+            $tableData[] = [
+                'time' => $hourKey . ":00-" . str_pad(intval($hourKey) + 1, 2, '0', STR_PAD_LEFT) . ":00",
+                'todayOrderNum' => $orderNum,
+                'todayPayNum' => $currentPayMap[$hourKey],
+                'todayPaySuccessRate' => $currentRateArr[$index],
+                'yesterdayOrderNum' => array_values($lastOrderMap)[$index],
+                'yesterdayPayNum' => array_values($lastPayMap)[$index],
+                'yesterdayPaySuccessRate' => $lastRateArr[$index],
+                'successRateChange' => $successRateChange[$index],
+            ];
+            $index++;
+        }
+        
+        return $tableData;
+    }
+
+    /**
+     * 生成按周的表格数据
+     */
+    private function generateWeekTableData(
+        $currentOrderMap,
+        $currentPayMap,
+        $currentRateArr,
+        $lastOrderMap,
+        $lastPayMap,
+        $lastRateArr,
+        $successRateChange,
+        $xAxisData
+    ) {
+        $tableData = [];
+        $index = 0;
+        
+        foreach ($currentOrderMap as $dateKey => $orderNum) {
+            $tableData[] = [
+                'time' => $xAxisData[$index],
+                'todayOrderNum' => $orderNum,
+                'todayPayNum' => $currentPayMap[$dateKey],
+                'todayPaySuccessRate' => $currentRateArr[$index],
+                'yesterdayOrderNum' => array_values($lastOrderMap)[$index],
+                'yesterdayPayNum' => array_values($lastPayMap)[$index],
+                'yesterdayPaySuccessRate' => $lastRateArr[$index],
+                'successRateChange' => $successRateChange[$index],
+            ];
+            $index++;
+        }
+        
+        return $tableData;
     }
 }