From 6947802c840493859ab9ed136d6df46589b41da2 Mon Sep 17 00:00:00 2001 From: hgc Date: Wed, 25 Dec 2024 13:21:17 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=95=B0=E6=8D=AE=E5=88=97?= =?UTF-8?q?=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/service/GoogleAdsReportService.php | 467 +++++++++++++------------ 1 file changed, 250 insertions(+), 217 deletions(-) diff --git a/app/service/GoogleAdsReportService.php b/app/service/GoogleAdsReportService.php index da1fb19..70df58a 100644 --- a/app/service/GoogleAdsReportService.php +++ b/app/service/GoogleAdsReportService.php @@ -21,52 +21,67 @@ class GoogleAdsReportService { // 基础查询:广告表和日数据表联接 $query = Ad::alias('a') + ->cache(false) // 强制不使用缓存 ->leftJoin('bps.bps_google_ads_ad_group g', 'a.ad_group_id = g.ad_group_id') // 关联广告组表 - ->leftJoin('bps.bps_google_ads_campaign c', 'a.campaign_id = c.campaign_id') // 关联广告系列表 - ->leftJoin('bps.bps_google_ad_day_data d', 'a.ad_id = d.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 . '%'); - } - }); - - // 如果提供了 startDate 和 endDate,则根据范围查询 + ->leftJoin('bps.bps_google_ads_campaign c', 'a.campaign_id = c.campaign_id'); // 关联广告系列表 + // 动态拼接 LEFT JOIN 的 ON 条件 + $onCondition = 'a.ad_id = d.ad_id'; if ($startDate && $endDate) { - $query->whereBetween('d.date', [$startDate, $endDate]); + $onCondition .= " AND d.date BETWEEN '{$startDate}' AND '{$endDate}'"; } else { - // 根据日期维度添加聚合条件 switch ($dateRange) { case 'Today': - $query->where('d.date', '=', date('Y-m-d')); + $onCondition .= " AND d.date = '" . date('Y-m-d') . "'"; break; case 'Yesterday': - $query->where('d.date', '=', date('Y-m-d', strtotime('-1 day'))); + $onCondition .= " AND d.date = '" . date('Y-m-d', strtotime('-1 day')) . "'"; break; case 'Last Week': - $query->where('d.date', '>=', date('Y-m-d', strtotime('-1 week'))); + $onCondition .= " AND d.date >= '" . date('Y-m-d', strtotime('-1 week')) . "'"; break; case 'Last Month': - $query->where('d.date', '>=', date('Y-m-d', strtotime('-1 month'))); + $onCondition .= " AND d.date >= '" . date('Y-m-d', strtotime('-1 month')) . "'"; break; case 'Last Year': - $query->where('d.date', '>=', date('Y-m-d', strtotime('-1 year'))); + $onCondition .= " AND d.date >= '" . date('Y-m-d', strtotime('-1 year')) . "'"; break; default: break; } } - // 获取分页数据 + // 添加 LEFT JOIN 日数据表 + $query->leftJoin('bps.bps_google_ad_day_data d', $onCondition); + // 添加字段、分组和查询条件 + $query->field('a.ad_id, -1 as ad_name, a.status as ad_status, a.customer_id, a.ad_group_id, g.ad_group_name as ad_group_name, a.campaign_id, c.campaign_name as campaign_name, + COALESCE(SUM(d.clicks), -1) as clicks, + COALESCE(SUM(d.cost_micros) / 1000000, -1) as spend, + COALESCE(SUM(d.conversions), -1) as results, + COALESCE(SUM(d.conversions_value), -1) as conversions_value, + COALESCE(SUM(d.impressions), -1) 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') + ->where(function ($query) use ($keyword) { + if ($keyword) { + $query->where('a.ad_name', 'like', '%' . $keyword . '%'); + } + }); + + // 获取查询结果 $ads = $query->paginate($pageSize, false, ['page' => $page]); + // 确保转换为数值 + $result = array_map(function ($item) { + $item['spend'] = (float)$item['spend']; + $item['conversions_value'] = (float)$item['conversions_value']; + return $item; + }, $ads->items()); + +// dump($query->getLastSql()); + // 返回分页和总数信息 return [ - 'data' => $ads->items(), + 'data' => $result, 'total' => $ads->total(), 'current_page' => $ads->currentPage(), 'last_page' => $ads->lastPage(), @@ -82,48 +97,54 @@ class GoogleAdsReportService */ public static function exportAdListToExcel($keyword, $dateRange, $startDate = null, $endDate = null) { - // 获取所有的广告数据 + // 基础查询:广告表和日数据表联接 $query = Ad::alias('a') + ->cache(false) // 强制不使用缓存 ->leftJoin('bps.bps_google_ads_ad_group g', 'a.ad_group_id = g.ad_group_id') // 关联广告组表 - ->leftJoin('bps.bps_google_ads_campaign c', 'a.campaign_id = c.campaign_id') // 关联广告系列表 - ->leftJoin('bps.bps_google_ad_day_data d', 'a.ad_id = d.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 中 + ->leftJoin('bps.bps_google_ads_campaign c', 'a.campaign_id = c.campaign_id'); // 关联广告系列表 + // 动态拼接 LEFT JOIN 的 ON 条件 + $onCondition = 'a.ad_id = d.ad_id'; + if ($startDate && $endDate) { + $onCondition .= " AND d.date BETWEEN '{$startDate}' AND '{$endDate}'"; + } else { + switch ($dateRange) { + case 'Today': + $onCondition .= " AND d.date = '" . date('Y-m-d') . "'"; + break; + case 'Yesterday': + $onCondition .= " AND d.date = '" . date('Y-m-d', strtotime('-1 day')) . "'"; + break; + case 'Last Week': + $onCondition .= " AND d.date >= '" . date('Y-m-d', strtotime('-1 week')) . "'"; + break; + case 'Last Month': + $onCondition .= " AND d.date >= '" . date('Y-m-d', strtotime('-1 month')) . "'"; + break; + case 'Last Year': + $onCondition .= " AND d.date >= '" . date('Y-m-d', strtotime('-1 year')) . "'"; + break; + default: + break; + } + } + + // 添加 LEFT JOIN 日数据表 + $query->leftJoin('bps.bps_google_ad_day_data d', $onCondition); + // 添加字段、分组和查询条件 + $query->field('a.ad_id, -1 as ad_name, a.status as ad_status, a.customer_id, a.ad_group_id, g.ad_group_name as ad_group_name, a.campaign_id, c.campaign_name as campaign_name, + COALESCE(SUM(d.clicks), -1) as clicks, + COALESCE(SUM(d.cost_micros) / 1000000, -1) as spend, + COALESCE(SUM(d.conversions), -1) as results, + COALESCE(SUM(d.conversions_value), -1) as conversions_value, + COALESCE(SUM(d.impressions), -1) 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') ->where(function ($query) use ($keyword) { if ($keyword) { $query->where('a.ad_name', 'like', '%' . $keyword . '%'); } }); - // 如果提供了 startDate 和 endDate,则根据范围查询 - if ($startDate && $endDate) { - $query->whereBetween('d.date', [$startDate, $endDate]); - $dateRange = $startDate. 'to'. $endDate; - } else { - // 根据日期维度添加聚合条件 - 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->select(); @@ -205,49 +226,60 @@ class GoogleAdsReportService */ public static function getCampaignList($page, $pageSize, $keyword, $dateRange, $startDate = null, $endDate = null) { - // 基础查询:广告活动和日数据表联接 +// 动态构建日期条件 + $dateCondition = ''; + if ($startDate && $endDate) { + $dateCondition = "d.date BETWEEN '{$startDate}' AND '{$endDate}'"; + } else { + switch ($dateRange) { + case 'Today': + $dateCondition = "d.date = '" . date('Y-m-d') . "'"; + break; + case 'Yesterday': + $dateCondition = "d.date = '" . date('Y-m-d', strtotime('-1 day')) . "'"; + break; + case 'Last Week': + $dateCondition = "d.date >= '" . date('Y-m-d', strtotime('-1 week')) . "'"; + break; + case 'Last Month': + $dateCondition = "d.date >= '" . date('Y-m-d', strtotime('-1 month')) . "'"; + break; + case 'Last Year': + $dateCondition = "d.date >= '" . date('Y-m-d', strtotime('-1 year')) . "'"; + break; + default: + $dateCondition = "1=1"; // 无日期限制,默认条件始终为真 + break; + } + } + +// 基础查询:广告活动和日数据表联接 $query = Campaign::alias('c') - ->leftJoin('bps.bps_google_ad_day_data d', 'c.campaign_id = d.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') + ->leftJoin('bps.bps_google_ad_day_data d', "c.campaign_id = d.campaign_id AND {$dateCondition}") // 将日期条件加入到 ON 子句中 + ->field('c.campaign_id, c.status as campaign_status, c.campaign_name, c.customer_id, + COALESCE(SUM(d.clicks), -1) as clicks, + COALESCE(SUM(d.cost_micros) / 1000000, -1) as spend, + COALESCE(SUM(d.conversions), -1) as results, + COALESCE(SUM(d.conversions_value), -1) as conversions_value, + COALESCE(SUM(d.impressions), -1) 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 . '%'); } }); - // 如果提供了 startDate 和 endDate,则根据范围查询 - if ($startDate && $endDate) { - $query->whereBetween('d.date', [$startDate, $endDate]); - } else { - // 根据日期维度添加聚合条件 - 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]); + // 确保转换为数值 + $result = array_map(function ($item) { + $item['spend'] = (float)$item['spend']; + $item['conversions_value'] = (float)$item['conversions_value']; + return $item; + }, $campaigns->items()); + // 返回分页和总数信息 return [ 'data' => $campaigns->items(), @@ -267,47 +299,50 @@ class GoogleAdsReportService */ public static function exportCampaignsToExcel($keyword, $dateRange, $startDate = null, $endDate = null) { - // 获取所有的广告系列数据 + // 动态构建日期条件 + $dateCondition = ''; + if ($startDate && $endDate) { + $dateCondition = "d.date BETWEEN '{$startDate}' AND '{$endDate}'"; + } else { + switch ($dateRange) { + case 'Today': + $dateCondition = "d.date = '" . date('Y-m-d') . "'"; + break; + case 'Yesterday': + $dateCondition = "d.date = '" . date('Y-m-d', strtotime('-1 day')) . "'"; + break; + case 'Last Week': + $dateCondition = "d.date >= '" . date('Y-m-d', strtotime('-1 week')) . "'"; + break; + case 'Last Month': + $dateCondition = "d.date >= '" . date('Y-m-d', strtotime('-1 month')) . "'"; + break; + case 'Last Year': + $dateCondition = "d.date >= '" . date('Y-m-d', strtotime('-1 year')) . "'"; + break; + default: + $dateCondition = "1=1"; // 无日期限制,默认条件始终为真 + break; + } + } + +// 基础查询:广告活动和日数据表联接 $query = Campaign::alias('c') - ->leftJoin('bps.bps_google_ad_day_data d', 'c.campaign_id = d.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') + ->leftJoin('bps.bps_google_ad_day_data d', "c.campaign_id = d.campaign_id AND {$dateCondition}") // 将日期条件加入到 ON 子句中 + ->field('c.campaign_id, c.status as campaign_status, c.campaign_name, c.customer_id, + COALESCE(SUM(d.clicks), -1) as clicks, + COALESCE(SUM(d.cost_micros) / 1000000, -1) as spend, + COALESCE(SUM(d.conversions), -1) as results, + COALESCE(SUM(d.conversions_value), -1) as conversions_value, + COALESCE(SUM(d.impressions), -1) 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 . '%'); } }); - // 如果提供了 startDate 和 endDate,则根据范围查询 - if ($startDate && $endDate) { - $query->whereBetween('d.date', [$startDate, $endDate]); - $dateRange = $startDate. 'to'. $endDate; - } else { - // 根据日期维度添加聚合条件 - 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->select(); @@ -378,71 +413,67 @@ class GoogleAdsReportService */ public static function getAdGroupList($page, $pageSize, $keyword, $dateRange, $startDate = null, $endDate = null) { - // 初始化查询 +// 动态构建日期条件 + $dateCondition = ''; + if ($startDate && $endDate) { + $dateCondition = "d.date BETWEEN '{$startDate}' AND '{$endDate}'"; + } else { + switch ($dateRange) { + case 'Today': + $dateCondition = "d.date = '" . date('Y-m-d') . "'"; + break; + case 'Yesterday': + $dateCondition = "d.date = '" . date('Y-m-d', strtotime('-1 day')) . "'"; + break; + case 'Last Week': + $dateCondition = "d.date >= '" . date('Y-m-d', strtotime('-1 week')) . "'"; + break; + case 'Last Month': + $dateCondition = "d.date >= '" . date('Y-m-d', strtotime('-1 month')) . "'"; + break; + case 'Last Year': + $dateCondition = "d.date >= '" . date('Y-m-d', strtotime('-1 year')) . "'"; + break; + default: + $dateCondition = "1=1"; // 默认无日期限制 + break; + } + } + +// 初始化查询 $query = AdGroup::alias('ag') - ->leftJoin('bps.bps_google_ad_day_data d', 'ag.ad_group_id = d.ad_group_id') - ->leftJoin('bps.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') + ->leftJoin("bps.bps_google_ad_day_data d", "ag.ad_group_id = d.ad_group_id AND {$dateCondition}") // 日期条件放入 ON 子句 + ->leftJoin("bps.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, + COALESCE(SUM(d.clicks), -1) as clicks, + COALESCE(SUM(d.cost_micros) / 1000000, -1) as spend, + COALESCE(SUM(d.conversions), -1) as results, + COALESCE(SUM(d.conversions_value), -1) as conversions_value, + COALESCE(SUM(d.impressions), -1) 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 . '%'); } }); - // 如果提供了 startDate 和 endDate,则根据范围查询 - if ($startDate && $endDate) { - $query->whereBetween('d.date', [$startDate, $endDate]); - } else { - // 根据日期维度添加聚合条件 - 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; - } - } +// 获取分页数据 + $adGroups = $query->paginate($pageSize, false, ['page' => $page]); + // 确保转换为数值 + $result = array_map(function ($item) { + $item['spend'] = (float)$item['spend']; + $item['conversions_value'] = (float)$item['conversions_value']; + return $item; + }, $adGroups->items()); - // 分页查询 - 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(), - ]; - } +// 返回分页和总数信息 + return [ + 'data' => $adGroups->items(), + 'total' => $adGroups->total(), + 'current_page' => $adGroups->currentPage(), + 'last_page' => $adGroups->lastPage(), + ]; } @@ -451,48 +482,50 @@ class GoogleAdsReportService */ public static function exportAdGroupsToExcel($keyword = '', $dateRange = 'Today', $startDate = null, $endDate = null) { - // 初始化查询 + // 动态构建日期条件 + $dateCondition = ''; + if ($startDate && $endDate) { + $dateCondition = "d.date BETWEEN '{$startDate}' AND '{$endDate}'"; + } else { + switch ($dateRange) { + case 'Today': + $dateCondition = "d.date = '" . date('Y-m-d') . "'"; + break; + case 'Yesterday': + $dateCondition = "d.date = '" . date('Y-m-d', strtotime('-1 day')) . "'"; + break; + case 'Last Week': + $dateCondition = "d.date >= '" . date('Y-m-d', strtotime('-1 week')) . "'"; + break; + case 'Last Month': + $dateCondition = "d.date >= '" . date('Y-m-d', strtotime('-1 month')) . "'"; + break; + case 'Last Year': + $dateCondition = "d.date >= '" . date('Y-m-d', strtotime('-1 year')) . "'"; + break; + default: + $dateCondition = "1=1"; // 默认无日期限制 + break; + } + } + +// 初始化查询 $query = AdGroup::alias('ag') - ->leftJoin('bps.bps_google_ad_day_data d', 'ag.ad_group_id = d.ad_group_id') - ->leftJoin('bps.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') + ->leftJoin("bps.bps_google_ad_day_data d", "ag.ad_group_id = d.ad_group_id AND {$dateCondition}") // 日期条件放入 ON 子句 + ->leftJoin("bps.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, + COALESCE(SUM(d.clicks), -1) as clicks, + COALESCE(SUM(d.cost_micros) / 1000000, -1) as spend, + COALESCE(SUM(d.conversions), -1) as results, + COALESCE(SUM(d.conversions_value), -1) as conversions_value, + COALESCE(SUM(d.impressions), -1) 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 . '%'); } }); - - - // 如果提供了 startDate 和 endDate,则根据范围查询 - if ($startDate && $endDate) { - $query->whereBetween('d.date', [$startDate, $endDate]); - $dateRange = $startDate. 'to'. $endDate; - } else { - // 根据日期维度添加聚合条件 - 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; - } - } // 获取所有广告组数据 $ad_groups = $query->select();