Переглянути джерело

广告账号消耗,支付成功率

ith5 2 місяців тому
батько
коміт
f9029e70af

+ 13 - 0
app/v1/controller/CommonController.php

@@ -4,6 +4,7 @@ namespace app\v1\controller;
 use app\v1\logic\advert\AgentListLogic;
 use app\v1\logic\advert\AgentSiteLogic;
 use app\v1\logic\advert\GamePackageLogic;
+use app\v1\logic\advert\MediaCostLogic;
 use app\v1\logic\advert\MediaListLogic;
 use app\v1\logic\center\GameGroupLogic;
 use app\v1\logic\center\GameLogic;
@@ -38,6 +39,8 @@ class CommonController extends BaseController
     protected $gameGroupLogic;
     protected $systemConfigLogic;
 
+    protected $mediaCostLogic;
+
     /**
      * 构造函数
      */
@@ -53,6 +56,7 @@ class CommonController extends BaseController
         $this->agentSiteLogic = new AgentSiteLogic();
         $this->gameGroupLogic = new GameGroupLogic();
         $this->systemConfigLogic = new SystemConfigLogic();
+        $this->mediaCostLogic = new MediaCostLogic();
     }
 
 
@@ -326,4 +330,13 @@ class CommonController extends BaseController
         return $this->success($data);
     }
 
+    /**
+     * 媒体与组织的树形KV
+     */
+    public function getMediaOrgTreeKv(Request $request): Response
+    {
+        $data = $this->mediaCostLogic->getMediaOrgTreeKv();
+        return $this->success($data);
+    }
+
 }

+ 13 - 0
app/v1/controller/customer/ReconciliationController.php

@@ -48,4 +48,17 @@ class ReconciliationController extends BaseController
     $result = $logic->getAgentDataList($where);
     return $this->success($result);
   }
+
+  // 广告账号消耗
+  public function getAdCost(Request $request)
+  {
+    $params = $request->more([
+        ['bm_id', ''],
+        ['advertiser_id', ''],
+        ['advertiser_name', ''],
+        ['date', ''],
+    ]);
+    $result = $this->logic->getAdCost($params);
+    return $this->success($result);
+  }
 }

+ 34 - 0
app/v1/logic/advert/MediaCostLogic.php

@@ -8,6 +8,7 @@ use plugin\saiadmin\exception\ApiException;
 use plugin\saiadmin\utils\Helper;
 use app\v1\model\advert\MediaCost;
 use plugin\saiadmin\app\logic\system\SystemUserLogic;
+use support\think\Db;
 
 /**
  * 媒体消耗逻辑层
@@ -34,6 +35,39 @@ class MediaCostLogic extends BaseLogic
         $this->setOrderType('desc');
     }
 
+    /**
+     * 媒体与组织树形KV
+     */
+    public function getMediaOrgTreeKv()
+    {
+        // 1. 获取媒体列表
+        $MediaList = Db::connect('db_advert')->table('media_list')->select()->toArray();
+        
+        // 2. 获取广告账号
+        $advertiserList = Db::connect('db_advert')->table('ad_advertiser_bm')->where('status', 1)->select()->toArray();
+        $advertiserListMap = array_column($advertiserList, null, 'media_id');
+        
+        $data = [];
+        foreach ($MediaList as $item) {
+            if($item['id'] !==0){
+                $children = [];
+                if(!empty($advertiserListMap[$item['id']])){
+                    $children[] = [
+                        'name'=>$advertiserListMap[$item['id']]['advertiser_name'],
+                        'id'=>$advertiserListMap[$item['id']]['id'],
+                        'parent_id'=>'group_id_'.$item['id'],
+                    ];
+                }
+                $data[] = [
+                    'name'=>$item['name'],
+                    'id'=>'group_id_'.$item['id'],
+                    'children'=>$children
+                ];
+            }
+        } 
+        return $data;
+    }
+
     /**
      * 添加数据
      * @param $data

+ 69 - 0
app/v1/logic/customer/ReconciliationLogic.php

@@ -138,4 +138,73 @@ class ReconciliationLogic extends BaseLogic
             'totalRow' => $totalRow
         ];
     }
+
+    /**
+     * 广告账号对账
+     */
+    public function getAdCost($params)
+    {
+      
+
+
+        $bmIds = $params['bm_id'];
+        
+        $advertiserId = $params['advertiser_id'];
+        $advertiserName = $params['advertiser_name'];
+        $date = $params['date'];
+       
+
+
+
+        $advertiserIds = [];
+        if(!empty($bmIds)){
+            $advertiserIds = Db::connect('db_advert')
+                ->table('ad_advertiser_list')
+                ->where('bmid', 'in', implode(',', $bmIds))
+                ->where('status', 1)
+                ->select()->toArray();
+            $advertiserIds = array_column($advertiserIds, 'advertiser_id');
+            $advertiserId = implode(',', $advertiserIds);
+        }
+
+
+        echo  Db::connect('db_advert')
+            ->table('media_cost')
+            ->field('media_cost.advertiser_id as advertiser_id, SUM(money) as money, SUM(ori_money) as ori_money, ad_advertiser_list.advertiser_name as advertiser_name')
+            ->where('media_cost.advertiser_id', 'in', $advertiserId)
+            ->whereTime('tdate', 'between', $date)
+            ->leftJoin('ad_advertiser_list', 'media_cost.advertiser_id = ad_advertiser_list.advertiser_id')
+             ->group('advertiser_name, advertiser_id')->buildSql();
+
+
+            $query = Db::connect('db_advert')
+                ->table('media_cost')
+                ->field('media_cost.advertiser_id as advertiser_id, SUM(money) as money, SUM(ori_money) as ori_money, ad_advertiser_list.advertiser_name as advertiser_name')
+                ->whereTime('tdate', 'between', $date)
+                ->leftJoin('ad_advertiser_list', 'media_cost.advertiser_id = ad_advertiser_list.advertiser_id');
+            if(!empty($advertiserId)){
+                $query->where('media_cost.advertiser_id', 'in', $advertiserId);
+            }
+            // 根据账号ID查询消耗
+            $adCost = $query->group('advertiser_name, advertiser_id')->select()->toArray();
+            $ori_money = 0;
+            $money = 0;
+            foreach($adCost as &$item){
+                $item['fandain'] = getRound($item['ori_money'], $item['money'], 2);
+                $ori_money += $item['ori_money'];
+                $money += $item['money'];
+            }
+
+            $totalRow = [
+                'advertiser_name' => '合计',
+                'ori_money' => $ori_money,
+                'money' => $money,
+            ];
+
+
+        return [
+            'data' => $adCost,
+            'totalRow' => $totalRow
+        ];
+    }
 }

+ 87 - 20
app/v1/logic/dataReport/AnalyseLogic.php

@@ -837,6 +837,9 @@ class AnalyseLogic extends BaseLogic
             $data = $this->getPaySuccessRateByDay($whereRaw);
             // 添加对比数据
             $data['comparison'] = $this->getDayComparisonFromPaySuccessRate($params);
+            // 添加支付渠道下单比例和数量
+            $data['channelData'] = $this->getChannelPaySuccessRate($params);
+
             return $data;
         } elseif ($type == 'week') {
             $data = $this->getPaySuccessRateByWeek($whereRaw);
@@ -848,6 +851,14 @@ class AnalyseLogic extends BaseLogic
         return [];
     }
 
+    /**
+     * 获取支付渠道下单比例和数量
+     */
+    private function getChannelPaySuccessRate($params)
+    {
+        
+    }
+
 
     /**
      * 从支付成功率接口获取日对比数据(今日vs昨日)
@@ -964,6 +975,11 @@ class AnalyseLogic extends BaseLogic
 
         // 获取当前周期和上一周期的数据
         $currentData = $this->getPayDataByTimeRange($whereRaw, $currentStartTime, $currentEndTime);
+
+
+        print_r($currentData);
+
+
         $lastData = $this->getPayDataByTimeRange($whereRaw, $lastStartTime, $lastEndTime);
 
         // 初始化24小时数据
@@ -988,6 +1004,9 @@ class AnalyseLogic extends BaseLogic
         // 计算成功率变化
         $successRateChange = $this->calculateRateChange($currentRateArr, $lastRateArr);
 
+        // 转换支付渠道下单比例和数量
+        $channelData = $this->trandformListColumn($currentData['channelData'],['pay_channel']);
+
         // 生成表格数据
         $tableData = $this->generateDayTableData(
             $currentOrderMap, 
@@ -996,7 +1015,7 @@ class AnalyseLogic extends BaseLogic
             $lastOrderMap, 
             $lastPayMap, 
             $lastRateArr,
-            $successRateChange
+            $successRateChange,
         );
 
         $currentOrderNum = array_sum($currentOrderMap);
@@ -1011,7 +1030,8 @@ class AnalyseLogic extends BaseLogic
             'paySuccessRate' => $paySuccessRate,
             'xAxisData' => $xAxisData,
             'successRateChange' => $successRateChange,
-            'data' => $tableData
+            'data' => $tableData,
+            'currentChannelData' => $channelData,
         ];
     }
 
@@ -1083,32 +1103,78 @@ class AnalyseLogic extends BaseLogic
     }
 
     /**
-     * 获取指定时间范围内的订单和支付数据
+     * 获取年表名称
+     */
+    private function getYearTableName($timestamp)
+    {
+        return 'sdk_order_' . date('Y', $timestamp);
+    }
+
+    /**
+     * 获取指定时间范围内的订单和支付数据和渠道支付下单数据
      */
     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
-        ");
+        
+        // 获取时间范围内的所有年份
+        $startYear = date('Y', $startTime);
+        $endYear = date('Y', $endTime);
+        $years = range($startYear, $endYear);
+        
+        $orderData = [];
+        $payData = [];
+        $channelData = [];
+        
+        // 遍历每个年份的表
+        foreach ($years as $year) {
+            $tableName = 'sdk_order_' . $year;
+            
+            // 检查表是否存在
+            $tableExists = Db::connect('db_game_log')->query("SHOW TABLES LIKE '{$tableName}'");
+            if (empty($tableExists)) {
+                continue;
+            }
+            
+            // 总下单量
+            $yearOrderData = Db::connect('db_game_log')->query("
+                SELECT Count(*) as order_num, pay_time
+                FROM {$tableName}
+                WHERE {$timeWhereRaw}
+                GROUP BY pay_time
+            ");
+            
+            // 总支付量
+            $yearPayData = Db::connect('db_game_log')->query("
+                SELECT Count(*) as pay_num, pay_time
+                FROM {$tableName}
+                WHERE {$timeWhereRaw} AND sync_status = 1
+                GROUP BY pay_time
+            ");
+
+            // 支付渠道下单比例和数量
+            $yearChannelData = Db::connect('db_game_log')->query("
+                SELECT pay_channel_id, COUNT(*) as pay_num
+                FROM {$tableName}
+                WHERE {$timeWhereRaw} AND sync_status = 1
+                GROUP BY pay_channel_id
+            ");
+
+
+
+            // 合并数据
+            $orderData = array_merge($orderData, $yearOrderData);
+            $payData = array_merge($payData, $yearPayData);
+            $channelData = array_merge($channelData, $yearChannelData);
+        }
 
         return [
             'orderData' => $orderData,
-            'payData' => $payData
+            'payData' => $payData,
+            'channelData' => $channelData
         ];
+
+       
     }
 
     /**
@@ -1267,6 +1333,7 @@ class AnalyseLogic extends BaseLogic
         $lastPayMap, 
         $lastRateArr,
         $successRateChange
+       
     ) {
         $tableData = [];
         $index = 0;

+ 6 - 2
plugin/saiadmin/basic/BaseLogic.php

@@ -206,7 +206,7 @@ class BaseLogic
      * @param $fields
      * @return mixed
      */
-    public function trandformListColumn($data, $fields = ['site', 'agent', 'game', 'auth', 'author', 'media', 'pay_channel', 'game_pay_channel', 'ip'])
+    public function trandformListColumn($data, $fields = ['site', 'agent', 'game', 'auth', 'author', 'media', 'pay_channel', 'game_pay_channel', 'ip','pay_channel_id'])
     {
 
         if (in_array('site', $fields)) {
@@ -244,7 +244,7 @@ class BaseLogic
         }
 
         if (in_array('game_pay_channel', $fields)) {
-            $gamePayChannelList = Db::connect('db_center')->table('pay_channel')->field('id,name')->where('status', 1)->select()->toArray();
+            $gamePayChannelList = Db::connect('db_center')->table('pay_channel')->field(field: 'id,name')->where('status', 1)->select()->toArray();
             $gamePayChannelList = array_column($gamePayChannelList, 'name', 'id');
         }
 
@@ -285,6 +285,10 @@ class BaseLogic
                 $value['wechat_jsapi_name'] = $gamePayChannelList[$value['wechat_jsapi']] ?? '-';
             }
 
+            // if (in_array('pay_channel_id', $fields)) {
+            //     $value['pay_channel_name'] = $gamePayChannelList[$value['pay_channel_id']] ?? '';
+            // }
+
             if (in_array('ip', $fields)) {
                 $value['ip'] = $value['ip'] ? $value['ip'] ."(". getIpLocation($value['ip']) .")" : '';
             }