Преглед на файлове

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

PC-202304251453\Administrator преди 2 месеца
родител
ревизия
ad0182eb67

+ 9 - 1
app/adapter/GdtAdapter.php

@@ -7,8 +7,16 @@ use GuzzleHttp\Client;
 
 class GdtAdapter
 {
-    public function OAuth($info)
+    public function OAuth($params)
     {
+
+        $auth_code = $params['auth_code'];
+        $appid = $params['appid'];
+       
+        // $secret = ACCOUNT[$cmid]['secret'];
+        $timestamp = time() - 120;
+
+
         // 执行验证callback, 返回授权后的字段,跟数据库对应
         return [
             "advertiser_id" => "",

+ 42 - 0
app/v1/controller/advert/AdAdvertiserAppController.php

@@ -0,0 +1,42 @@
+<?php
+
+namespace app\v1\controller\advert;
+
+use plugin\saiadmin\basic\BaseController;
+use app\v1\logic\advert\AdAdvertiserAppLogic;
+use app\v1\validate\advert\AdAdvertiserAppValidate;
+use support\Request;
+use support\Response;
+
+/**
+ * 开放平台应用授权信息控制器
+ */
+class AdAdvertiserAppController extends BaseController
+{
+    /**
+     * 构造函数
+     */
+    public function __construct()
+    {
+        $this->logic = new AdAdvertiserAppLogic();
+        $this->validate = new AdAdvertiserAppValidate;
+        parent::__construct();
+    }
+
+    /**
+     * 数据列表
+     * @param Request $request
+     * @return Response
+     */
+    public function index(Request $request): Response
+    {
+        $where = $request->more([
+            ['name', ''],
+            ['app_id', ''],
+        ]);
+        $query = $this->logic->search($where);
+        $data = $this->logic->getList($query);
+        return $this->success($data);
+    }
+
+}

+ 13 - 0
app/v1/controller/dataReport/AnalyseController.php

@@ -120,4 +120,17 @@ class AnalyseController extends BaseController
         $data = $this->logic->getChartData($where);
         return $this->success($data);
     }
+
+    // 支付成功率
+    public function getPaySuccessRate(Request $request)
+    {
+        $where = $request->more([
+            ['main_id',''],
+            ['game_id', ''],
+            ['type', 'day']
+        ]);
+        $data = $this->logic->getPaySuccessRate($where);
+        return $this->success($data);
+    }
+
 }

+ 23 - 0
app/v1/logic/advert/AdAdvertiserAppLogic.php

@@ -0,0 +1,23 @@
+<?php
+
+namespace app\v1\logic\advert;
+
+use plugin\saiadmin\basic\BaseLogic;
+use plugin\saiadmin\exception\ApiException;
+use plugin\saiadmin\utils\Helper;
+use app\v1\model\advert\AdAdvertiserApp;
+
+/**
+ * 开放平台应用授权信息逻辑层
+ */
+class AdAdvertiserAppLogic extends BaseLogic
+{
+    /**
+     * 构造函数
+     */
+    public function __construct()
+    {
+        $this->model = new AdAdvertiserApp();
+    }
+
+}

+ 495 - 0
app/v1/logic/dataReport/AnalyseLogic.php

@@ -825,4 +825,499 @@ class AnalyseLogic extends BaseLogic
             ];
         }
     }
+
+    // 支付成功率(包含对比数据)
+    public function getPaySuccessRate($where)
+    {
+        $params = $this->searchByAuth($where);
+        $whereRaw = $this->getCommonWhereRaw($params);
+        $type = $params['type'] ?? 'day';
+
+        if ($type == 'day') {
+            $data = $this->getPaySuccessRateByDay($whereRaw);
+            // 添加对比数据
+            $data['comparison'] = $this->getDayComparisonFromPaySuccessRate($params);
+            return $data;
+        } elseif ($type == 'week') {
+            $data = $this->getPaySuccessRateByWeek($whereRaw);
+            // 添加对比数据
+            $data['comparison'] = $this->getWeekComparisonFromPaySuccessRate($params);
+            return $data;
+        }
+
+        return [];
+    }
+
+
+    /**
+     * 从支付成功率接口获取日对比数据(今日vs昨日)
+     */
+    private function getDayComparisonFromPaySuccessRate($params)
+    {
+        // 复用支付成功率接口的数据
+        $paySuccessData = $this->getPaySuccessRateByDay($this->getCommonWhereRaw($params));
+        
+        // 从支付成功率数据中提取今日和昨日的数据
+        $todayOrderNum = $paySuccessData['orderNum'];
+        $todayPayNum = $paySuccessData['successNum'];
+        $todayPaySuccessRate = $paySuccessData['paySuccessRate'];
+        
+        // 计算昨日数据(从表格数据中获取)
+        $tableData = $paySuccessData['data'];
+        $yesterdayOrderNum = 0;
+        $yesterdayPayNum = 0;
+        foreach ($tableData as $row) {
+            $yesterdayOrderNum += $row['yesterdayOrderNum'];
+            $yesterdayPayNum += $row['yesterdayPayNum'];
+        }
+        $yesterdayPaySuccessRate = $yesterdayOrderNum > 0 ? getRound($yesterdayPayNum, $yesterdayOrderNum) : 0;
+
+        // 计算变化百分比和趋势
+        $orderChange = $this->calculateChangePercentage($todayOrderNum, $yesterdayOrderNum);
+        $payChange = $this->calculateChangePercentage($todayPayNum, $yesterdayPayNum);
+        $rateChange = $this->calculateChangePercentage($todayPaySuccessRate, $yesterdayPaySuccessRate);
+
+        return [
+            'type' => 'day',
+            'current' => [
+                'orderNum' => $todayOrderNum,
+                'payNum' => $todayPayNum,
+                'paySuccessRate' => $todayPaySuccessRate,
+                'label' => '今日'
+            ],
+            'previous' => [
+                'orderNum' => $yesterdayOrderNum,
+                'payNum' => $yesterdayPayNum,
+                'paySuccessRate' => $yesterdayPaySuccessRate,
+                'label' => '昨日'
+            ],
+            'changes' => [
+                'orderChange' => array_merge($orderChange, ['label' => '较昨日']),
+                'payChange' => array_merge($payChange, ['label' => '较昨日']),
+                'rateChange' => array_merge($rateChange, ['label' => '较昨日'])
+            ]
+        ];
+    }
+
+    /**
+     * 从支付成功率接口获取周对比数据(本周vs上周)
+     */
+    private function getWeekComparisonFromPaySuccessRate($params)
+    {
+        // 复用支付成功率接口的数据
+        $paySuccessData = $this->getPaySuccessRateByWeek($this->getCommonWhereRaw($params));
+        
+        // 从支付成功率数据中提取本周和上周的数据
+        $thisWeekOrderNum = $paySuccessData['orderNum'];
+        $thisWeekPayNum = $paySuccessData['successNum'];
+        $thisWeekPaySuccessRate = $paySuccessData['paySuccessRate'];
+        
+        // 计算上周数据(从表格数据中获取)
+        $tableData = $paySuccessData['data'];
+        $lastWeekOrderNum = 0;
+        $lastWeekPayNum = 0;
+        foreach ($tableData as $row) {
+            $lastWeekOrderNum += $row['yesterdayOrderNum'];
+            $lastWeekPayNum += $row['yesterdayPayNum'];
+        }
+        $lastWeekPaySuccessRate = $lastWeekOrderNum > 0 ? getRound($lastWeekPayNum, $lastWeekOrderNum) : 0;
+
+        // 计算变化百分比和趋势
+        $orderChange = $this->calculateChangePercentage($thisWeekOrderNum, $lastWeekOrderNum);
+        $payChange = $this->calculateChangePercentage($thisWeekPayNum, $lastWeekPayNum);
+        $rateChange = $this->calculateChangePercentage($thisWeekPaySuccessRate, $lastWeekPaySuccessRate);
+
+        return [
+            'type' => 'week',
+            'current' => [
+                'orderNum' => $thisWeekOrderNum,
+                'payNum' => $thisWeekPayNum,
+                'paySuccessRate' => $thisWeekPaySuccessRate,
+                'label' => '本周'
+            ],
+            'previous' => [
+                'orderNum' => $lastWeekOrderNum,
+                'payNum' => $lastWeekPayNum,
+                'paySuccessRate' => $lastWeekPaySuccessRate,
+                'label' => '上周'
+            ],
+            'changes' => [
+                'orderChange' => array_merge($orderChange, ['label' => '较上周']),
+                'payChange' => array_merge($payChange, ['label' => '较上周']),
+                'rateChange' => array_merge($rateChange, ['label' => '较上周'])
+            ]
+        ];
+    }
+
+    /**
+     * 按天对比支付成功率(今天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;
+
+        return [
+            'PaySuccessRateArr' => $currentRateArr,
+            'OldPaySuccessRateArr' => $lastRateArr,
+            'orderNum' => $currentOrderNum,
+            'successNum' => $currentPaySuccessNum,
+            'paySuccessRate' => $paySuccessRate,
+            'xAxisData' => $xAxisData,
+            'successRateChange' => $successRateChange,
+            'data' => $tableData
+        ];
+    }
+
+    /**
+     * 按周对比支付成功率(本周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;
+        }
+    }
+
+    /**
+     * 按天填充数据
+     */
+    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;
+    }
+
+    /**
+     * 计算变化百分比和趋势
+     */
+    private function calculateChangePercentage($currentValue, $previousValue)
+    {
+        if ($previousValue == 0) {
+            $trend = $currentValue > 0 ? 'up' : 'stable';
+            $percentage = $currentValue > 0 ? 100 : 0;
+            return [
+                'percentage' => $percentage,
+                'percentageText' => $percentage . '%',
+                'trend' => $trend,
+                'value' => $currentValue - $previousValue,
+                'icon' => $trend == 'up' ? 'icon-arrow-rise' : 'icon-arrow-stable'
+            ];
+        }
+        
+        $percentage = round((($currentValue - $previousValue) / $previousValue) * 100, 2);
+        $trend = $percentage > 0 ? 'up' : ($percentage < 0 ? 'down' : 'stable');
+        
+        // 根据趋势设置图标
+        $icon = 'icon-arrow-stable';
+        if ($trend == 'up') {
+            $icon = 'icon-arrow-rise';
+        } elseif ($trend == 'down') {
+            $icon = 'icon-arrow-fall';
+        }
+        
+        return [
+            'percentage' => abs($percentage),
+            'percentageText' => abs($percentage) . '%',
+            'trend' => $trend,
+            'value' => $currentValue - $previousValue,
+            'icon' => $icon
+        ];
+    }
+
+    /**
+     * 生成小时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;
+    }
+
+    /**
+     * 生成星期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;
+    }
 }

+ 38 - 0
app/v1/model/advert/AdAdvertiserApp.php

@@ -0,0 +1,38 @@
+<?php
+
+namespace app\v1\model\advert;
+
+use plugin\saiadmin\basic\BaseNormalModel;
+
+/**
+ * 开放平台应用授权信息模型
+ */
+class AdAdvertiserApp extends BaseNormalModel
+{
+    /**
+     * 数据表主键
+     * @var string
+     */
+    protected $pk = 'id';
+
+    /**
+     * 数据库表名称
+     * @var string
+     */
+    protected $table = 'ad_advertiser_app';
+
+    /**
+     * 数据库连接
+     * @var string
+     */
+    protected $connection = 'db_advert';
+
+    /**
+     * 应用名称 搜索
+     */
+    public function searchNameAttr($query, $value)
+    {
+        $query->where('name', 'like', '%'.$value.'%');
+    }
+
+}

+ 62 - 0
app/v1/validate/advert/AdAdvertiserAppValidate.php

@@ -0,0 +1,62 @@
+<?php
+
+namespace app\v1\validate\advert;
+
+use think\Validate;
+
+/**
+ * 开放平台应用授权信息验证器
+ */
+class AdAdvertiserAppValidate extends Validate
+{
+    /**
+     * 定义验证规则
+     */
+    protected $rule =   [
+        'media_id' => 'require',
+        'name' => 'require',
+        'app_id' => 'require',
+        'app_secret' => 'require',
+        'auth_url' => 'require',
+        'token_url' => 'require',
+        'refresh_url' => 'require',
+    ];
+
+    /**
+     * 定义错误信息
+     */
+    protected $message  =   [
+        'media_id' => '媒体渠道ID必须填写',
+        'name' => '应用名称必须填写',
+        'app_id' => '应用ID必须填写',
+        'app_secret' => '应用密钥必须填写',
+        'auth_url' => 'OAuth授权地址必须填写',
+        'token_url' => 'Token获取地址必须填写',
+        'refresh_url' => 'Token刷新地址必须填写',
+    ];
+
+    /**
+     * 定义场景
+     */
+    protected $scene = [
+        'save' => [
+            'media_id',
+            'name',
+            'app_id',
+            'app_secret',
+            'auth_url',
+            'token_url',
+            'refresh_url',
+        ],
+        'update' => [
+            'media_id',
+            'name',
+            'app_id',
+            'app_secret',
+            'auth_url',
+            'token_url',
+            'refresh_url',
+        ],
+    ];
+
+}

BIN
plugin/saiadmin/public/export/广点通分包_标识数据_20251009171119.xlsx


BIN
public/storage/20251010/9fe915fafbf15d0ea293eb7b62b5cd548a0ebac1.jpeg