From 94c6ac12ee73f5375e4b2e2700273f1085f8b4bf Mon Sep 17 00:00:00 2001 From: hgc Date: Fri, 20 Dec 2024 10:28:03 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9B=E5=BB=BA=E5=89=8D=E7=AB=AF=E5=AF=B9?= =?UTF-8?q?=E6=8E=A5=E5=88=97=E8=A1=A8=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controller/AdController.php | 76 ++++++++++ app/model/Ad.php | 2 +- app/model/AdGroup.php | 2 +- app/model/Campaign.php | 2 +- app/model/CampaignBudget.php | 2 +- app/model/DayData.php | 2 +- app/service/GoogleAdsReportService.php | 186 +++++++++++++++++++++++++ config/route.php | 16 ++- 8 files changed, 282 insertions(+), 6 deletions(-) create mode 100644 app/controller/AdController.php create mode 100644 app/service/GoogleAdsReportService.php diff --git a/app/controller/AdController.php b/app/controller/AdController.php new file mode 100644 index 0000000..5f1b4a4 --- /dev/null +++ b/app/controller/AdController.php @@ -0,0 +1,76 @@ +input('page', 1); // 页码 + $pageSize = $request->input('page_size', 20); // 每页数量 + $keyword = $request->input('keyword', ''); // 关键字搜索 + $dateRange = $request->input('date_range', 'Today'); // 日期范围 + + // 调用 Service 层查询 + $result = $this->googleAdsReportService::getAdList($page, $pageSize, $keyword, $dateRange); + return $this->successResponse($result); + } + public function listCampaigns(Request $request) + { + // 获取请求参数 + $page = $request->input('page', 1); // 页码 + $pageSize = $request->input('page_size', 20); // 每页数量 + $keyword = $request->input('keyword', ''); // 关键字搜索 + $dateRange = $request->input('date_range', 'Today'); // 日期范围 + + // 调用 Service 层查询 + $result = $this->googleAdsReportService::getCampaignList($page, $pageSize, $keyword, $dateRange); + return $this->successResponse($result); + } + + public function listGroups(Request $request) + { + // 获取请求参数 + $page = $request->input('page', 1); // 页码 + $pageSize = $request->input('page_size', 20); // 每页数量 + $keyword = $request->input('keyword', ''); // 关键字搜索 + $dateRange = $request->input('date_range', 'Today'); // 日期范围 + + // 调用 Service 层查询 + $result = $this->googleAdsReportService::getAdGroupList($page, $pageSize, $keyword, $dateRange); + return $this->successResponse($result); + } + + // 可以加入一些公共方法 + protected function successResponse($data): Response + { + return Json([ + 'code' => 0, + 'msg' => date('Y-m-d'), + 'data' => $data, + ]); + } + + protected function errorResponse($code, $message, $data = []): Response + { + return Json([ + 'code' => $code, + 'msg' => $message ?: 'error', + 'data' => $data + ]); + } + +} diff --git a/app/model/Ad.php b/app/model/Ad.php index 8405959..a585e90 100644 --- a/app/model/Ad.php +++ b/app/model/Ad.php @@ -7,7 +7,7 @@ use think\Model; class Ad extends Model { // 设置当前模型对应的完整数据表名称 - protected $table = 'bps_google_ads_ad'; + protected $table = 'public.bps_google_ads_ad'; // 设置主键 protected $pk = 'ad_id'; diff --git a/app/model/AdGroup.php b/app/model/AdGroup.php index ceb0bc0..33bb2d7 100644 --- a/app/model/AdGroup.php +++ b/app/model/AdGroup.php @@ -7,7 +7,7 @@ use think\Model; class AdGroup extends Model { // 设置当前模型对应的完整数据表名称 - protected $table = 'bps_google_ads_ad_group'; + protected $table = 'public.bps_google_ads_ad_group'; // 设置主键 protected $pk = 'ad_group_id'; diff --git a/app/model/Campaign.php b/app/model/Campaign.php index 0c13f6c..695ad34 100644 --- a/app/model/Campaign.php +++ b/app/model/Campaign.php @@ -7,7 +7,7 @@ use think\Model; class Campaign extends Model { // 设置当前模型对应的完整数据表名称 - protected $table = 'bps_google_ads_campaign'; + protected $table = 'public.bps_google_ads_campaign'; // 设置主键 protected $pk = 'campaign_id'; diff --git a/app/model/CampaignBudget.php b/app/model/CampaignBudget.php index b4b831b..b6c34b2 100644 --- a/app/model/CampaignBudget.php +++ b/app/model/CampaignBudget.php @@ -7,7 +7,7 @@ use think\Model; class CampaignBudget extends Model { // 设置当前模型对应的完整数据表名称 - protected $table = 'bps_google_ads_budget'; + protected $table = 'public.bps_google_ads_budget'; // 设置主键 protected $pk = 'budget_id'; diff --git a/app/model/DayData.php b/app/model/DayData.php index 415c9b6..3ca4396 100644 --- a/app/model/DayData.php +++ b/app/model/DayData.php @@ -7,7 +7,7 @@ use think\Model; class DayData extends Model { // 设置当前模型对应的完整数据表名称 - protected $table = 'bps_google_ad_day_data'; + protected $table = 'public.bps_google_ad_day_data'; // 设置复合主键 protected $pk = ['ad_id', 'date']; diff --git a/app/service/GoogleAdsReportService.php b/app/service/GoogleAdsReportService.php new file mode 100644 index 0000000..4393325 --- /dev/null +++ b/app/service/GoogleAdsReportService.php @@ -0,0 +1,186 @@ +leftJoin('bps_google_ad_day_data d', 'a.ad_id = d.ad_id') + ->field('a.ad_id, a.ad_name, a.status as ad_status, a.customer_id, + SUM(d.clicks) as clicks, SUM(d.cost_micros) as cost_micros, + SUM(d.conversions) as conversions, SUM(d.conversions_value) as conversions_value, + SUM(d.impressions) as impressions') + ->group('a.ad_id') + ->where(function ($query) use ($keyword) { + if ($keyword) { + $query->where('a.ad_name', 'like', '%' . $keyword . '%'); + } + }); + + // 根据日期维度添加聚合条件 + switch ($dateRange) { + case 'Today': + $query->where('d.date', '=', date('Y-m-d')); + break; + case 'Yesterday': + $query->where('d.date', '=', date('Y-m-d', strtotime('-1 day'))); + break; + case 'Last Week': + $query->where('d.date', '>=', date('Y-m-d', strtotime('-1 week'))); + break; + case 'Last Month': + $query->where('d.date', '>=', date('Y-m-d', strtotime('-1 month'))); + break; + case 'Last Year': + $query->where('d.date', '>=', date('Y-m-d', strtotime('-1 year'))); + break; + default: + break; + } + + // 获取分页数据 + $ads = $query->paginate($pageSize, false, ['page' => $page]); + + // 返回分页和总数信息 + return [ + 'data' => $ads->items(), + 'total' => $ads->total(), + 'current_page' => $ads->currentPage(), + 'last_page' => $ads->lastPage(), + ]; + } + + + /** + * 获取广告系列列表 + */ + public static function getCampaignList($page, $pageSize, $keyword, $dateRange) + { + // 基础查询:广告活动和日数据表联接 + $query = Campaign::alias('c') + ->leftJoin('bps_google_ad_day_data d', 'c.campaign_id = d.campaign_id') + ->field('c.campaign_id, c.status as campaign_status, c.customer_id, + SUM(d.clicks) as clicks, SUM(d.cost_micros) as cost_micros, + SUM(d.conversions) as conversions, SUM(d.conversions_value) as conversions_value, + SUM(d.impressions) as impressions') + ->group('c.campaign_id') + ->where(function ($query) use ($keyword) { + if ($keyword) { + $query->where('c.campaign_name', 'like', '%' . $keyword . '%'); + } + }); + + // 根据日期维度添加聚合条件 + switch ($dateRange) { + case 'Today': + $query->where('d.date', '=', date('Y-m-d')); + break; + case 'Yesterday': + $query->where('d.date', '=', date('Y-m-d', strtotime('-1 day'))); + break; + case 'Last Week': + $query->where('d.date', '>=', date('Y-m-d', strtotime('-1 week'))); + break; + case 'Last Month': + $query->where('d.date', '>=', date('Y-m-d', strtotime('-1 month'))); + break; + case 'Last Year': + $query->where('d.date', '>=', date('Y-m-d', strtotime('-1 year'))); + break; + default: + break; + } + + // 获取分页数据 + $campaigns = $query->paginate($pageSize, false, ['page' => $page]); + + // 返回分页和总数信息 + return [ + 'data' => $campaigns->items(), + 'total' => $campaigns->total(), + 'current_page' => $campaigns->currentPage(), + 'last_page' => $campaigns->lastPage(), + ]; + } + + /** + * 获取广告系列列表 + */ + public static function getAdGroupList($page, $pageSize, $keyword, $dateRange) + { + // 初始化查询 + $query = AdGroup::alias('ag') + ->leftJoin('bps_google_ad_day_data d', 'ag.ad_group_id = d.ad_group_id') + ->field('ag.ad_group_id, ag.campaign_id, ag.customer_id, + SUM(d.clicks) as clicks, SUM(d.cost_micros) as cost_micros, + SUM(d.conversions) as conversions, SUM(d.conversions_value) as conversions_value, + SUM(d.impressions) as impressions') + ->group('ag.ad_group_id') + ->where(function ($query) use ($keyword) { + if ($keyword) { + $query->where('ag.ad_group_name', 'like', '%' . $keyword . '%'); + } + }); + + // 根据日期范围添加聚合条件 + switch ($dateRange) { + case 'Today': + $query->where('d.date', '=', date('Y-m-d')); + break; + case 'Yesterday': + $query->where('d.date', '=', date('Y-m-d', strtotime('-1 day'))); + break; + case 'Last Week': + $query->where('d.date', '>=', date('Y-m-d', strtotime('-1 week'))); + break; + case 'Last Month': + $query->where('d.date', '>=', date('Y-m-d', strtotime('-1 month'))); + break; + case 'Last Year': + $query->where('d.date', '>=', date('Y-m-d', strtotime('-1 year'))); + break; + default: + break; + } + + // 分页查询 + try { + +// $sql = $query->fetchSql()->select(); // fetchSql() 会返回 SQL 查询语句 +// echo "Executed SQL: " . $sql; // 输出执行的 SQL + + $result = $query->paginate([ + 'list_rows' => $pageSize, // 每页数量 + 'page' => $page, // 当前页码 + ]); + + // 返回分页数据 + return [ + 'data' => $result->items(), + 'total' => $result->total(), + 'current_page' => $result->currentPage(), + 'last_page' => $result->lastPage(), + ]; + } catch (DbException $e) { + // 处理数据库查询错误 + return [ + 'error' => 'Database query failed: ' . $e->getMessage(), + ]; + } + } + +} diff --git a/config/route.php b/config/route.php index e607964..f3d5a03 100644 --- a/config/route.php +++ b/config/route.php @@ -12,7 +12,8 @@ * @license http://www.opensource.org/licenses/mit-license.php MIT License */ -use app\controller\IndexController; +//use app\controller\IndexController; +use app\controller\AdController; use app\controller\GoogleAdsController; use Webman\Route; @@ -27,6 +28,19 @@ use Webman\Route; //}); Route::group('/googleads', function () { + + Route::group('/v18', function () { + Route::group('/ad', function () { + Route::post('/list', [AdController::class, 'listAds']); + }); + Route::group('/campaign', function () { + Route::post('/list', [AdController::class, 'listCampaigns']); + }); + Route::group('/adgroup', function () { + Route::post('/list', [AdController::class, 'listGroups']); + }); + }); + Route::group('/campaign', function () { Route::post('/create', [GoogleAdsController::class, 'createCampaign']); });