From 237168491240da9c0f3ebd923b254a106ea9e058 Mon Sep 17 00:00:00 2001 From: hgc Date: Sat, 21 Dec 2024 16:20:20 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=8A=A5=E5=91=8A=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/service/GoogleAdsReportService.php | 188 +++++++++++++++---------- 1 file changed, 115 insertions(+), 73 deletions(-) diff --git a/app/service/GoogleAdsReportService.php b/app/service/GoogleAdsReportService.php index 3ab8c2a..313b356 100644 --- a/app/service/GoogleAdsReportService.php +++ b/app/service/GoogleAdsReportService.php @@ -21,12 +21,14 @@ class GoogleAdsReportService { // 基础查询:广告表和日数据表联接 $query = Ad::alias('a') + ->leftJoin('bps_google_ads_ad_group g', 'a.ad_group_id = g.ad_group_id') // 关联广告组表 + ->leftJoin('bps_google_ads_campaign c', 'a.campaign_id = c.campaign_id') // 关联广告系列表 ->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') + ->field('a.ad_id, -1 as ad_name, a.status as ad_status, a.customer_id,a.ad_group_id, g.ad_group_name, a.campaign_id,c.campaign_name, + SUM(d.clicks) as clicks, SUM(d.cost_micros) / 1000000 as spend, + SUM(d.conversions) as results, SUM(d.conversions_value) as conversions_value, + SUM(d.impressions) as reach,-1 as roas,-1 as be_roas,-1 as revenue, -1 as profit, -1 as delivery') + ->group('a.ad_id, a.ad_name, a.status, a.customer_id, a.ad_group_id, g.ad_group_name, a.campaign_id, c.campaign_name') // 确保所有字段都在 group by 中 ->where(function ($query) use ($keyword) { if ($keyword) { $query->where('a.ad_name', 'like', '%' . $keyword . '%'); @@ -77,12 +79,14 @@ class GoogleAdsReportService { // 获取所有的广告数据 $query = Ad::alias('a') + ->leftJoin('bps_google_ads_ad_group g', 'a.ad_group_id = g.ad_group_id') // 关联广告组表 + ->leftJoin('bps_google_ads_campaign c', 'a.campaign_id = c.campaign_id') // 关联广告系列表 ->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') + ->field('a.ad_id, -1 as ad_name, a.status as ad_status, a.customer_id,a.ad_group_id, g.ad_group_name, a.campaign_id,c.campaign_name, + SUM(d.clicks) as clicks, SUM(d.cost_micros) / 1000000 as spend, + SUM(d.conversions) as results, SUM(d.conversions_value) as conversions_value, + SUM(d.impressions) as reach,-1 as roas,-1 as be_roas,-1 as revenue, -1 as profit, -1 as delivery') + ->group('a.ad_id, a.ad_name, a.status, a.customer_id, a.ad_group_id, g.ad_group_name, a.campaign_id, c.campaign_name') // 确保所有字段都在 group by 中 ->where(function ($query) use ($keyword) { if ($keyword) { $query->where('a.ad_name', 'like', '%' . $keyword . '%'); @@ -119,27 +123,43 @@ class GoogleAdsReportService // 设置表头 $sheet->setCellValue('A1', 'Ad ID'); - $sheet->setCellValue('B1', 'Ad Name'); - $sheet->setCellValue('C1', 'Customer ID'); - $sheet->setCellValue('D1', 'Ad Status'); - $sheet->setCellValue('E1', 'Clicks'); - $sheet->setCellValue('F1', 'Cost Micros'); - $sheet->setCellValue('G1', 'Conversions'); - $sheet->setCellValue('H1', 'Conversions Value'); - $sheet->setCellValue('I1', 'Impressions'); + $sheet->setCellValue('B1', 'Ad Status'); + $sheet->setCellValue('C1', 'Name'); + $sheet->setCellValue('D1', 'Campaign'); + $sheet->setCellValue('E1', 'Ad Set'); + $sheet->setCellValue('F1', 'Delivery'); + $sheet->setCellValue('G1', 'Results'); + $sheet->setCellValue('H1', 'Reach'); + $sheet->setCellValue('I1', 'Revenue'); + $sheet->setCellValue('J1', 'ROAS'); + $sheet->setCellValue('K1', 'beROAS'); + $sheet->setCellValue('L1', 'Profit'); + $sheet->setCellValue('M1', 'Spend'); +// $sheet->setCellValue('N1', 'Customer ID'); +// $sheet->setCellValue('E1', 'Clicks'); +// $sheet->setCellValue('F1', 'Cost Micros'); +// $sheet->setCellValue('G1', 'Conversions'); +// $sheet->setCellValue('H1', 'Conversions Value'); +// $sheet->setCellValue('I1', 'Impressions'); // 填充数据 $row = 2; // 从第二行开始 foreach ($ads as $ad) { $sheet->setCellValueExplicit('A' . $row, (string)$ad->ad_id, \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING); // 设置 ad_id 为文本 - $sheet->setCellValueExplicit('B' . $row, $ad->ad_name); // 直接设置 ad_name - $sheet->setCellValueExplicit('C' . $row, (string)$ad->customer_id, \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING); // 设置 customer_id 为文本 - $sheet->setCellValue('D' . $row, $ad->ad_status); - $sheet->setCellValue('E' . $row, $ad->clicks); - $sheet->setCellValue('F' . $row, $ad->cost_micros); + $sheet->setCellValue('B' . $row, $ad->ad_status); + $sheet->setCellValueExplicit('C' . $row, $ad->ad_name); // 直接设置 ad_name + $sheet->setCellValueExplicit('D' . $row, $ad->campaign_name); // 直接设置 ad_name + $sheet->setCellValueExplicit('E' . $row, $ad->ad_group_name); // 直接设置 ad_name + $sheet->setCellValueExplicit('F' . $row, $ad->delivery); // 直接设置 ad_name $sheet->setCellValue('G' . $row, $ad->conversions); - $sheet->setCellValue('H' . $row, $ad->conversions_value); - $sheet->setCellValue('I' . $row, $ad->impressions); + $sheet->setCellValue('H' . $row, $ad->reach); + $sheet->setCellValue('I' . $row, $ad->revenue); + $sheet->setCellValue('J' . $row, $ad->roas); + $sheet->setCellValue('K' . $row, $ad->be_roas); + $sheet->setCellValue('L' . $row, $ad->profit); + $sheet->setCellValue('M' . $row, $ad->spend); +// $sheet->setCellValueExplicit('N' . $row, (string)$ad->customer_id, \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING); // 设置 customer_id 为文本 + $row++; } @@ -168,11 +188,11 @@ class GoogleAdsReportService // 基础查询:广告活动和日数据表联接 $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') + ->field('c.campaign_id, c.status as campaign_status,c.campaign_name, c.customer_id, + SUM(d.clicks) as clicks, SUM(d.cost_micros) / 1000000 as spend, + SUM(d.conversions) as results, SUM(d.conversions_value) as conversions_value, + SUM(d.impressions) as reach,-1 as roas,-1 as be_roas,-1 as revenue, -1 as profit, -1 as delivery') + ->group('c.campaign_id, c.status,c.customer_id, c.campaign_name') ->where(function ($query) use ($keyword) { if ($keyword) { $query->where('c.campaign_name', 'like', '%' . $keyword . '%'); @@ -225,11 +245,11 @@ class GoogleAdsReportService // 获取所有的广告系列数据 $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') + ->field('c.campaign_id, c.status as campaign_status,c.campaign_name, c.customer_id, + SUM(d.clicks) as clicks, SUM(d.cost_micros) / 1000000 as spend, + SUM(d.conversions) as results, SUM(d.conversions_value) as conversions_value, + SUM(d.impressions) as reach,-1 as roas,-1 as be_roas,-1 as revenue, -1 as profit, -1 as delivery') + ->group('c.campaign_id, c.status,c.customer_id, c.campaign_name') ->where(function ($query) use ($keyword) { if ($keyword) { $query->where('c.campaign_name', 'like', '%' . $keyword . '%'); @@ -266,26 +286,33 @@ class GoogleAdsReportService // 设置表头 $sheet->setCellValue('A1', 'Campaign ID'); - $sheet->setCellValue('B1', 'Customer ID'); - $sheet->setCellValue('C1', 'Status'); - $sheet->setCellValue('D1', 'Clicks'); - $sheet->setCellValue('E1', 'Cost Micros'); - $sheet->setCellValue('F1', 'Conversions'); - $sheet->setCellValue('G1', 'Conversions Value'); - $sheet->setCellValue('H1', 'Impressions'); + $sheet->setCellValue('B1', 'Status'); + $sheet->setCellValue('C1', 'Name'); + $sheet->setCellValue('D1', 'Delivery'); + $sheet->setCellValue('E1', 'Results'); + $sheet->setCellValue('F1', 'Reach'); + $sheet->setCellValue('G1', 'Revenue'); + $sheet->setCellValue('H1', 'ROAS'); + $sheet->setCellValue('I1', 'beROAS'); + $sheet->setCellValue('J1', 'Profit'); + $sheet->setCellValue('K1', 'Spend'); // 填充数据 $row = 2; // 从第二行开始 foreach ($campaigns as $campaign) { //使用 setCellValueExplicit 显式设置为文本格式 $sheet->setCellValueExplicit('A' . $row, (string)$campaign->campaign_id, \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING); // 设置为文本格式 - $sheet->setCellValueExplicit('B' . $row, (string)$campaign->customer_id, \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING); // 设置为文本格式 - $sheet->setCellValue('C' . $row, $campaign->campaign_status); - $sheet->setCellValue('D' . $row, $campaign->clicks); - $sheet->setCellValue('E' . $row, $campaign->cost_micros); - $sheet->setCellValue('F' . $row, $campaign->conversions); - $sheet->setCellValue('G' . $row, $campaign->conversions_value); - $sheet->setCellValue('H' . $row, $campaign->impressions); + $sheet->setCellValue('B' . $row, $campaign->campaign_status); + $sheet->setCellValueExplicit('C' . $row, $campaign->campaign_name); + $sheet->setCellValueExplicit('D' . $row, $campaign->delivery); // 直接设置 ad_name + $sheet->setCellValue('E' . $row, $campaign->conversions); + $sheet->setCellValue('F' . $row, $campaign->reach); + $sheet->setCellValue('G' . $row, $campaign->revenue); + $sheet->setCellValue('H' . $row, $campaign->roas); + $sheet->setCellValue('I' . $row, $campaign->be_roas); + $sheet->setCellValue('J' . $row, $campaign->profit); + $sheet->setCellValue('K' . $row, $campaign->spend); +// $sheet->setCellValueExplicit('N' . $row, (string)$campaign->customer_id, \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING); // 设置为文本格式 $row++; } @@ -315,11 +342,12 @@ class GoogleAdsReportService // 初始化查询 $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') + ->leftJoin('bps_google_ads_campaign c', 'ag.campaign_id = c.campaign_id') // 关联广告系列表 + ->field('ag.ad_group_id,ag.ad_group_name,ag.status as ad_group_status, ag.campaign_id,c.campaign_name, ag.customer_id, + SUM(d.clicks) as clicks, SUM(d.cost_micros) / 1000000 as spend, + SUM(d.conversions) as results, SUM(d.conversions_value) as conversions_value, + SUM(d.impressions) as reach,-1 as roas,-1 as be_roas,-1 as revenue, -1 as profit, -1 as delivery') + ->group('ag.ad_group_id,ag.ad_group_name,ag.status, ag.campaign_id,c.campaign_name, ag.customer_id') ->where(function ($query) use ($keyword) { if ($keyword) { $query->where('ag.ad_group_name', 'like', '%' . $keyword . '%'); @@ -382,11 +410,12 @@ class GoogleAdsReportService // 初始化查询 $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') + ->leftJoin('bps_google_ads_campaign c', 'ag.campaign_id = c.campaign_id') // 关联广告系列表 + ->field('ag.ad_group_id,ag.ad_group_name,ag.status as ad_group_status, ag.campaign_id,c.campaign_name, ag.customer_id, + SUM(d.clicks) as clicks, SUM(d.cost_micros) / 1000000 as spend, + SUM(d.conversions) as results, SUM(d.conversions_value) as conversions_value, + SUM(d.impressions) as reach,-1 as roas,-1 as be_roas,-1 as revenue, -1 as profit, -1 as delivery') + ->group('ag.ad_group_id,ag.ad_group_name,ag.status, ag.campaign_id,c.campaign_name, ag.customer_id') ->where(function ($query) use ($keyword) { if ($keyword) { $query->where('ag.ad_group_name', 'like', '%' . $keyword . '%'); @@ -422,27 +451,40 @@ class GoogleAdsReportService $sheet = $spreadsheet->getActiveSheet(); // 设置表头 - $sheet->setCellValue('A1', 'Ad Group ID') - ->setCellValue('B1', 'Campaign ID') - ->setCellValue('C1', 'Customer ID') - ->setCellValue('D1', 'Clicks') - ->setCellValue('E1', 'Cost Micros') - ->setCellValue('F1', 'Conversions') - ->setCellValue('G1', 'Conversions Value') - ->setCellValue('H1', 'Impressions'); + $sheet->setCellValue('A1', 'Ad Group ID'); + $sheet->setCellValue('B1', 'Status'); + $sheet->setCellValue('C1', 'Name'); + $sheet->setCellValue('D1', 'Campaign'); + $sheet->setCellValue('E1', 'Delivery'); + $sheet->setCellValue('F1', 'Results'); + $sheet->setCellValue('G1', 'Reach'); + $sheet->setCellValue('H1', 'Revenue'); + $sheet->setCellValue('I1', 'ROAS'); + $sheet->setCellValue('J1', 'beROAS'); + $sheet->setCellValue('K1', 'Profit'); + $sheet->setCellValue('L1', 'Spend'); + // 填充数据 $row = 2; foreach ($ad_groups as $adGroup) { // 使用 setCellValueExplicit 显式设置为文本格式 $sheet->setCellValueExplicit('A' . $row, (string)$adGroup->ad_group_id, \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING); // 设置为文本格式 - $sheet->setCellValueExplicit('B' . $row, (string)$adGroup->campaign_id, \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING); - $sheet->setCellValueExplicit('C' . $row, (string)$adGroup->customer_id, \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING); - $sheet->setCellValue('D' . $row, $adGroup->clicks); - $sheet->setCellValue('E' . $row, $adGroup->cost_micros); +// $sheet->setCellValueExplicit('B' . $row, (string)$adGroup->campaign_id, \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING); + $sheet->setCellValue('B' . $row, $adGroup->ag_group_status); + $sheet->setCellValueExplicit('C' . $row, $adGroup->ad_group_name); + $sheet->setCellValueExplicit('D' . $row, $adGroup->campaign_name); + $sheet->setCellValueExplicit('E' . $row, $adGroup->delivery); // 直接设置 ad_name $sheet->setCellValue('F' . $row, $adGroup->conversions); - $sheet->setCellValue('G' . $row, $adGroup->conversions_value); - $sheet->setCellValue('H' . $row, $adGroup->impressions); + $sheet->setCellValue('G' . $row, $adGroup->reach); + $sheet->setCellValue('H' . $row, $adGroup->revenue); + $sheet->setCellValue('I' . $row, $adGroup->roas); + $sheet->setCellValue('J' . $row, $adGroup->be_roas); + $sheet->setCellValue('K' . $row, $adGroup->profit); + $sheet->setCellValue('L' . $row, $adGroup->spend); + +// $sheet->setCellValueExplicit('M' . $row, (string)$adGroup->customer_id, \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING); + $row++; }