Explorar el Código

广告推送相关

ith5 hace 6 meses
padre
commit
bddb8bf2bb

+ 2 - 1
app/v1/controller/CommonController.php

@@ -121,7 +121,8 @@ class CommonController extends BaseController
      */
     public function getPackageOptions(Request $request): Response
     {
-        $data = $this->gamePackageLogic->getPackageOptions();
+        $where = $request->get();
+        $data = $this->gamePackageLogic->getPackageOptions($where);
         return $this->success($data);
     }
 

+ 2 - 7
app/v1/controller/advert/AgentListController.php

@@ -43,15 +43,10 @@ class AgentListController extends BaseController
         ]);
         $query = $this->logic->search($where);
         $data = $this->logic->getList($query);
-        // $userListData = array_column($this->systemUserLogic->field('id,username')->select()->toArray(),'username','id');
         $data=$this->logic->trandformListColumn($data['data'],['auth','media']);
-
-        // $data['data'] = array_map(function ($item) use ($userListData) {
-        //     $item['auth_name'] = $userListData[$item['auth_id']] ?? '';
-        //     return $item;
-        // }, $data['data']);
-
         return $this->success($data);
     }
 
+
+
 }

+ 34 - 0
app/v1/controller/advert/AgentSiteController.php

@@ -63,4 +63,38 @@ class AgentSiteController extends BaseController
         return $this->success($data);
     }
 
+        /**
+     * 获取头条账号
+     */
+    public function getTtAccountOptions(Request $request): Response
+    {
+        $data = $this->logic->getTtAccountList();
+        return $this->success($data);
+    }
+
+        /**
+     * 导出分包标识数据
+     * @param Request $request
+     * @return Response
+     */
+    public function exportGamePackageKs(Request $request): Response
+    {
+        $data = $request->post();
+        return $this->logic->exportGamePackageKs($data);
+      
+    }
+
+    /**
+     * 头条推送新事件
+     * @param Request $request
+     * @return Response
+     */
+    public function ttPushNewEvent(Request $request): Response
+    {
+        $data = $request->post();
+        $result = $this->logic->ttPushNewEvent($data);
+        return $this->success($result);
+    }
+
+
 }

+ 14 - 1
app/v1/controller/gameLog/GamePackLogController.php

@@ -39,8 +39,21 @@ class GamePackLogController extends BaseController
         ]);
         $query = $this->logic->search($where);
         $data = $this->logic->getList($query);
-        $data['data'] = $this->logic->trandformListColumn($data['data'],['agent','site','package']);
+        $data['data'] = $this->logic->trandformListColumn($data['data'],['agent','site']);
         return $this->success($data);
     }
 
+    /**
+     * 批量打包
+     * @param Request $request
+     * @return Response
+     */
+    public function batchSave(Request $request): Response
+    {
+        $data = $request->all();
+        $res = $this->logic->batchSave($data);
+        return $this->success();
+    }
+
+
 }

+ 4 - 0
app/v1/logic/advert/AgentListLogic.php

@@ -10,6 +10,8 @@ use plugin\saiadmin\basic\BaseLogic;
 use plugin\saiadmin\exception\ApiException;
 use plugin\saiadmin\utils\Helper;
 use app\v1\model\advert\AgentList;
+use plugin\saiadmin\service\OpenSpoutWriter;
+use support\think\Db;
 
 /**
  * 渠道管理逻辑层
@@ -33,4 +35,6 @@ class AgentListLogic extends BaseLogic
 
         return $data;
     }
+
+    
 }

+ 259 - 0
app/v1/logic/advert/AgentSiteLogic.php

@@ -6,10 +6,17 @@
 // +----------------------------------------------------------------------
 namespace app\v1\logic\advert;
 
+use app\v1\logic\gameLog\GamePackageLogic;
 use plugin\saiadmin\basic\BaseLogic;
 use plugin\saiadmin\exception\ApiException;
 use plugin\saiadmin\utils\Helper;
 use app\v1\model\advert\AgentSite;
+use GuzzleHttp\Client;
+
+use Illuminate\Support\Facades\Http;
+use plugin\saiadmin\service\OpenSpoutWriter;
+
+use support\think\Db;
 
 /**
  * 广告位列表逻辑层
@@ -33,4 +40,256 @@ class AgentSiteLogic extends BaseLogic
         return $data;
     }
 
+    /**
+     * 获取头条账号列表
+     */
+    public function getTtAccountList()
+    {
+        $data = Db::connect('db_advert')->table('ad_jrtt_account_list')->where('status', 1)->select()->toArray();
+        return $data;
+    }
+
+    /**
+     * 根据广告位IDS集合获取广告位数据  
+     */
+    public function getAgentSiteListBySiteIds($site_ids = [])
+    {
+        $data = $this->model->whereIn('id', $site_ids)->select()->toArray();
+        return $data;
+    }
+
+
+    /**
+     * 导出分包标识数据
+     */
+    public function exportGamePackageKs($data = [])
+    {
+        $file_name = $data['title'].'_标识数据_'.date('YmdHis').'.xlsx';
+        $header = $data['title']=='快手分包' ? ['渠道','备注'] : ['备注','渠道'];
+        $data = array_map(function($item){
+            return [
+                'agent_id' => explode(',', $item)[0],
+                'remark' => explode(',', $item)[1]
+            ];
+        }, $data['data']);
+       
+        $writer = new OpenSpoutWriter($file_name);
+        $writer->setWidth([15, 15]);
+        $writer->setHeader($header);
+        $writer->setData($data);
+        $file_path = $writer->returnFile();
+        return response()->download($file_path, urlencode($file_name));
+    }
+
+    /**
+     * 获取头条推送的access_token
+     */
+    public function getTtAccessToken($advertiser_id)
+    {
+        $data = Db::connect('db_advert')->table('ad_jrtt_account')->where('advertiser_id', $advertiser_id)->where('status', 1)->value('access_token');
+        return $data;
+    }
+
+    /**
+     * 获取头条媒体配置
+     */
+    public function getTtMediaConfig()
+    {
+        $data = Db::connect('db_advert')->table('media_list')->where('state', 1)->where('name','今日头条')->select()->toArray();
+        return $data;
+    }
+
+    /**
+     * 获取头条媒体配置
+     */
+    public function getTtAssetid($data = [])
+    {
+        $data = Db::connect('db_advert_log')->table('ad_jrtt_asset')->where('game_id', $data['game_id'])->where('advertiser_id', $data['advertiser_id'])->value('assets_id');
+        return $data;
+    }
+
+    /**
+     * 头条推送事件
+     */
+    public function ttPushNewEvent($data = [])
+    {
+        // 获取头条的游戏
+        $toutiaoGameData = (new GamePackageLogic())->getToutiaoGames();
+
+        // 广告位ID集合
+        $site_ids = $data['site_ids'];
+        // 平台的游戏ID
+        $game_id = $data['game_id'];
+        // 分包标识
+        $fb = $data['fb'];
+        // 推送转化跟踪
+        $zh = $data['zh'];
+        // 头条广告主ID
+        $advertiser_id = $data['advertiser_id'];
+        // 成功数
+        $succ = $succ2 = 0;
+        // 失败数
+        $fail = $fail2 = 0;
+
+        // 广告位数据
+        $agentSiteList = [];
+
+        // 错误数组
+        $error = [];
+
+        // 检查广告位是否传入
+        if(empty($site_ids)){
+            throw new ApiException('请选择广告位');
+        }
+
+        // 获取广告位数据
+        $agentSiteList =  $this->getAgentSiteListBySiteIds($site_ids);
+        if(!$agentSiteList){
+            throw new ApiException('广告位数据错误');
+        }
+        $agentSiteList = array_column($agentSiteList, null, 'id');
+
+        print_r('agentSiteList');
+        print_r($agentSiteList);
+        
+        // 检查游戏是否为头条媒体的母包
+        if(!$game_id || !$toutiaoGameData[$game_id]){
+            throw new ApiException('请选择推送的头条游戏');
+        }
+        // 检查广告位是否为头条媒体的广告位
+        $siteData = (new AgentSiteLogic())->getAgentSiteOptions();
+        $siteData = array_column($siteData, null, 'id');
+        $site_ids = explode(',', $site_ids);
+        foreach($site_ids as $site_id){
+            if($siteData[$site_id]['media_id']!=1){
+                throw new ApiException('请选择头条媒体的广告位');
+            }
+        }
+
+        // 推送头条分包
+        if($fb){
+             // 头条游戏平台
+             $os = $toutiaoGameData[$game_id]['game_os'];
+             if($os == 2){
+                throw new ApiException('IOS不能推送分包');
+             }
+             // 获取头条的access_token
+                $access_token = $this->getTtAccessToken($advertiser_id);
+               
+                if(!$access_token){
+                    throw new ApiException('推送头条的-access_token获取失败');
+                }
+                $header = [
+                    'Access-Token' => $access_token,
+                    'Content-Type' => 'application/json',
+                ];
+                $list = [];
+                
+                foreach ($site_ids as $val) {
+                
+                    $list[] = [
+                        // 渠道ID = 平台游戏ID_渠道ID_广告位ID
+                        'channel_id' => $game_id.'_'.$agentSiteList[$val]['agent_id'].'_'.$val,
+                        // 备注 = 平台游戏名称-广告位ID
+                        'remark'     => $toutiaoGameData[$game_id]['name'].'-'.$val,
+                    ];
+
+                    //记录提交信息
+                    $values = [
+                        'game_id'       => $game_id,
+                        'agent_id'      => $agentSiteList[$val]['agent_id'],
+                        'site_id'       => $val,
+                        'advertiser_id' => $advertiser_id,
+                        'package_id'    => $toutiaoGameData[$game_id]['tt_package_id'],
+                        'remark'        => $toutiaoGameData[$game_id]['name'].'-'.$val,
+                    ];
+
+                    
+                    Db::connect('db_advert_log')->table('ad_jrtt_channel_package')->insert($values);
+                   
+                }
+                // 推送给头条数据
+                $pushData = [
+                    'account_id' => $advertiser_id,
+                    'package_id' => $toutiaoGameData[$game_id]['tt_package_id'],
+                    'channel_list' => $list,
+                    'mode' => 'Manual',
+                ];
+                 $url = 'https://ad.oceanengine.com/open_api/2/tools/app_management/extend_package/create/';
+                // 发送请求
+
+                $client = new Client();
+                $headers = [
+                    'Access-Token' => $access_token,
+                    'Content-Type'  => 'application/json'
+                ];
+
+                // 发起 POST 请求
+                $response = $client->post($url, [
+                    'headers' => $headers,
+                    'json'    => $pushData, // 如果是 application/json
+                ]);
+
+                // 获取响应内容
+                $body = $response->getBody()->getContents();
+                $result = json_decode($body, true);
+               
+                 if($result['message']=='OK'){
+                    $succ = "成功";
+                 } else {
+                    $error[] = "请求:".json_encode($pushData, 256) ."结果:".json_encode($result, 256);
+                    $succ = '失败';
+                 }
+        }
+        // 推送转化跟踪
+        if($zh){
+            // assetId
+             $asset_id  = $this->getTtAssetid(['game_id'=>$game_id,'advertiser_id'=>$advertiser_id]);
+             if(!$asset_id){    
+                throw new ApiException('推送头条的-asset_id获取失败');
+             }
+             $mediaArr = $this->getTtMediaConfig();
+             print_r('mediaArr');
+             print_r($mediaArr);
+            
+             foreach ($site_ids as $val) {
+                    $site_id = $val;
+                    $agent_id = $agentSiteList[$val]['agent_id'];
+                    $group_name = $toutiaoGameData[$game_id]['name'].'_'.$val;
+                   // $error 长度
+                   if(count($error)>0){
+                        $fail2++;
+                        continue;
+                   }
+
+                    if($toutiaoGameData[$game_id]['ios_appid']>0){
+                        $apiurl = $mediaArr[0]['iosurl'];
+                        $downloadurl = 'https://itunes.apple.com/cn/app/id'.$toutiaoGameData[$game_id]['ios_appid'];
+                    } else {
+                        $apiurl = $mediaArr[0]['andurl'];
+                        $downloadurl = 'https://apps.bytesfield.com/download/extend/cur/'.$toutiaoGameData[$game_id]['tt_package_id'].'/'.$toutiaoGameData[$game_id]['id'].'_'.$agent_id.'_'.$val;
+                    }
+                    $yfinfo = $game_id.'_'.$agent_id.'_'.$site_id;
+                    $click_url = str_replace('__YFINFO__', $yfinfo, $apiurl);
+                    $values = [
+                        'game_id'       => $game_id,
+                        'gid'           => $game_id,
+                        'agent_id'      => $agent_id,
+                        'site_id'       => $site_id,
+                        'advertiser_id' => $advertiser_id,
+                        'assets_id'     => $asset_id,
+                        'download_url'  => $downloadurl,
+                        'click_url'     => $click_url,
+                        'group_name'    => $group_name,
+                    ];
+                    $result = Db::connect('db_advert_log')->table('ad_jrtt_asset')->insert($values);
+                    if($result){
+                        $succ2 ++;
+                    } else {
+                        $fail2 ++;
+                    }
+                }
+            } 
+        return ['message' => "分包推送".$succ.",转化推送成功".$succ2.",失败".$fail2];
+    }
 }

+ 11 - 0
app/v1/logic/gameLog/GamePackLogLogic.php

@@ -10,6 +10,8 @@ use plugin\saiadmin\basic\BaseLogic;
 use plugin\saiadmin\exception\ApiException;
 use plugin\saiadmin\utils\Helper;
 use app\v1\model\gameLog\GamePackLog;
+use Illuminate\Support\Facades\Date;
+use plugin\saiadmin\service\OpenSpoutWriter;
 
 /**
  * 打包记录逻辑层
@@ -24,5 +26,14 @@ class GamePackLogLogic extends BaseLogic
         $this->model = new GamePackLog();
     }
     
+    /**
+     * 批量打包
+     */
+    public function batchSave($data)
+    {
+        $res = $this->model->insertAll($data);
+        return $res;
+    }
+
 
 }

+ 14 - 2
app/v1/logic/gameLog/GamePackageLogic.php

@@ -27,9 +27,21 @@ class GamePackageLogic extends BaseLogic
     /**
      * 获取母包Options
      */
-    public function getPackageOptions()
+    public function getPackageOptions($where = [])
     {
-        $data = $this->model->select()->toArray();
+        $data = $this->model->where($where)->select()->toArray();
+        return $data;
+    }
+
+    /**
+     * 获取头条游戏
+     */
+    public function getToutiaoGames()
+    {
+        $data = $this->model->where('media_id', 1)->select()->toArray();
+        $data = $this->trandformListColumn($data, ['game']);
+        // 以game_id为key,value为数组
+        $data = array_column($data, null, 'game_id');
         return $data;
     }
 }

+ 35 - 0
config/think-orm.php

@@ -213,5 +213,40 @@ return [
                 'heartbeat_interval' => 50, // 心跳检测间隔,需要小于60秒
             ],
         ],
+        'db_advert_log' => [
+            // 数据库类型
+            'type' => getenv('DB_TYPE'),
+            // 服务器地址
+            'hostname' => getenv('DB_HOST'),
+            // 数据库名
+            'database' => getenv('DB_ADVERT_LOG'),
+            // 数据库用户名
+            'username' => getenv('DB_USER'),
+            // 数据库密码
+            'password' => getenv('DB_PASSWORD'),
+            // 数据库连接端口
+            'hostport' => getenv('DB_PORT'),
+            // 数据库连接参数
+            'params' => [
+                // 连接超时3秒
+                \PDO::ATTR_TIMEOUT => 3,
+            ],
+            // 数据库编码默认采用utf8
+            'charset' => 'utf8',
+            // 数据库表前缀
+            'prefix' => getenv('DB_PREFIX'),
+            // 断线重连
+            'break_reconnect' => true,
+            // 自定义分页类
+            'bootstrap' =>  '',
+            // 连接池配置
+            'pool' => [
+                'max_connections' => 5, // 最大连接数
+                'min_connections' => 1, // 最小连接数
+                'wait_timeout' => 3,    // 从连接池获取连接等待超时时间
+                'idle_timeout' => 60,   // 连接最大空闲时间,超过该时间会被回收
+                'heartbeat_interval' => 50, // 心跳检测间隔,需要小于60秒
+            ],
+        ],
     ],
 ];

+ 12 - 10
plugin/saiadmin/basic/BaseLogic.php

@@ -270,7 +270,7 @@ class BaseLogic
      * @param $fields
      * @return mixed
      */
-    public function trandformListColumn($data, $fields=['site', 'agent', 'game', 'auth', 'media', 'package', 'pay_channel']){
+    public function trandformListColumn($data, $fields=['site', 'agent', 'game', 'auth', 'media',  'pay_channel']){
 
         if(in_array('site', $fields)){
             $agentSiteList = Db::connect('db_advert')->table('agent_site')->field('id,name')->select()->toArray();
@@ -283,8 +283,8 @@ class BaseLogic
            
         }
         if(in_array('game', $fields)){
-            $gameList = Db::connect('db_center')->table('pf_game')->field('id,name')->select()->toArray();
-            $gameList = array_column($gameList, 'name', 'id');
+            $gameList = Db::connect('db_center')->table('pf_game')->field('id,name,os,ios_appid')->select()->toArray();
+            $gameList = array_column($gameList, null, 'id');
            
         }
         if(in_array('auth', $fields)){
@@ -296,10 +296,10 @@ class BaseLogic
             $mediaList = Db::connect('db_advert')->table('media_list')->field('id,name')->select()->toArray();
             $mediaList = array_column($mediaList, 'name', 'id');
         }
-        if(in_array('package', $fields)){
-            $packageList = Db::connect('db_game_log')->table('game_package')->field('id,name')->select()->toArray();
-            $packageList = array_column($packageList, 'name', 'id');
-        }
+        // if(in_array('package', $fields)){
+        //     $packageList = Db::connect('db_game_log')->table('game_package')->field('id,name')->select()->toArray();
+        //     $packageList = array_column($packageList, 'name', 'id');
+        // }
 
         if(in_array('pay_channel', $fields)){
             $payChannelList = Db::connect('db_center')->table('pay_channel')->field('id,name')->where('status',1)->select()->toArray();
@@ -311,11 +311,13 @@ class BaseLogic
     
             $data[$key]['site_name'] = !empty($agentSiteList) ? $agentSiteList[$value['site_id']] ?? '':'';
             $data[$key]['agent_name'] = !empty($agentList) ? $agentList[$value['agent_id']] ?? '':'';
-            $data[$key]['game_name'] = !empty($gameList) ? $gameList[$value['game_id']] ?? '':'';
+            $data[$key]['game_name'] = !empty($gameList) ? $gameList[$value['game_id']]['name'] ?? '':'';
+            $data[$key]['game_os'] =  !empty($gameList) ? $gameList[$value['game_id']]['os'] ?? '':'';
+            $data[$key]['ios_appid'] =  !empty($gameList) ? $gameList[$value['game_id']]['ios_appid'] ?? '':'';
             $data[$key]['auth_name'] = !empty($authList) ? $authList[$value['auth_id']] ?? '':'';
             $data[$key]['media_name'] = !empty($mediaList) ? $mediaList[$value['media_id']] ?? '':'';
-            $data[$key]['package_name'] = !empty($packageList) ? $packageList[$value['package_id']] ?? '':'';
-            $data[$key]['pay_channel_name'] = !empty($payChannelList) ? $payChannelList[$value['pay_channel']] ?? '':'';
+            // $data[$key]['package_name'] = !empty($packageList) ? $packageList[$value['package_id']] ?? '':'';
+            $data[$key]['pay_channel_name'] = !empty($payChannelList) ? $payChannelList[$value['pay_channel_id']] ?? '':'';
         }
         return $data;
     }