更新数据列表
This commit is contained in:
parent
5cc8f65f7f
commit
6947802c84
@ -21,52 +21,67 @@ class GoogleAdsReportService
|
|||||||
{
|
{
|
||||||
// 基础查询:广告表和日数据表联接
|
// 基础查询:广告表和日数据表联接
|
||||||
$query = Ad::alias('a')
|
$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_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_ads_campaign c', 'a.campaign_id = c.campaign_id'); // 关联广告系列表
|
||||||
->leftJoin('bps.bps_google_ad_day_data d', 'a.ad_id = d.ad_id')
|
// 动态拼接 LEFT JOIN 的 ON 条件
|
||||||
->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,
|
$onCondition = 'a.ad_id = d.ad_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('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,则根据范围查询
|
|
||||||
if ($startDate && $endDate) {
|
if ($startDate && $endDate) {
|
||||||
$query->whereBetween('d.date', [$startDate, $endDate]);
|
$onCondition .= " AND d.date BETWEEN '{$startDate}' AND '{$endDate}'";
|
||||||
} else {
|
} else {
|
||||||
// 根据日期维度添加聚合条件
|
|
||||||
switch ($dateRange) {
|
switch ($dateRange) {
|
||||||
case 'Today':
|
case 'Today':
|
||||||
$query->where('d.date', '=', date('Y-m-d'));
|
$onCondition .= " AND d.date = '" . date('Y-m-d') . "'";
|
||||||
break;
|
break;
|
||||||
case 'Yesterday':
|
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;
|
break;
|
||||||
case 'Last Week':
|
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;
|
break;
|
||||||
case 'Last Month':
|
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;
|
break;
|
||||||
case 'Last Year':
|
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;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
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]);
|
$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 [
|
return [
|
||||||
'data' => $ads->items(),
|
'data' => $result,
|
||||||
'total' => $ads->total(),
|
'total' => $ads->total(),
|
||||||
'current_page' => $ads->currentPage(),
|
'current_page' => $ads->currentPage(),
|
||||||
'last_page' => $ads->lastPage(),
|
'last_page' => $ads->lastPage(),
|
||||||
@ -82,48 +97,54 @@ class GoogleAdsReportService
|
|||||||
*/
|
*/
|
||||||
public static function exportAdListToExcel($keyword, $dateRange, $startDate = null, $endDate = null)
|
public static function exportAdListToExcel($keyword, $dateRange, $startDate = null, $endDate = null)
|
||||||
{
|
{
|
||||||
// 获取所有的广告数据
|
// 基础查询:广告表和日数据表联接
|
||||||
$query = Ad::alias('a')
|
$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_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_ads_campaign c', 'a.campaign_id = c.campaign_id'); // 关联广告系列表
|
||||||
->leftJoin('bps.bps_google_ad_day_data d', 'a.ad_id = d.ad_id')
|
// 动态拼接 LEFT JOIN 的 ON 条件
|
||||||
->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,
|
$onCondition = 'a.ad_id = d.ad_id';
|
||||||
SUM(d.clicks) as clicks, SUM(d.cost_micros) / 1000000 as spend,
|
if ($startDate && $endDate) {
|
||||||
SUM(d.conversions) as results, SUM(d.conversions_value) as conversions_value,
|
$onCondition .= " AND d.date BETWEEN '{$startDate}' AND '{$endDate}'";
|
||||||
SUM(d.impressions) as reach,-1 as roas,-1 as be_roas,-1 as revenue, -1 as profit, -1 as delivery')
|
} else {
|
||||||
->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 中
|
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) {
|
->where(function ($query) use ($keyword) {
|
||||||
if ($keyword) {
|
if ($keyword) {
|
||||||
$query->where('a.ad_name', 'like', '%' . $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();
|
$ads = $query->select();
|
||||||
@ -205,13 +226,43 @@ class GoogleAdsReportService
|
|||||||
*/
|
*/
|
||||||
public static function getCampaignList($page, $pageSize, $keyword, $dateRange, $startDate = null, $endDate = null)
|
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')
|
$query = Campaign::alias('c')
|
||||||
->leftJoin('bps.bps_google_ad_day_data d', 'c.campaign_id = d.campaign_id')
|
->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,
|
->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,
|
COALESCE(SUM(d.clicks), -1) as clicks,
|
||||||
SUM(d.conversions) as results, SUM(d.conversions_value) as conversions_value,
|
COALESCE(SUM(d.cost_micros) / 1000000, -1) as spend,
|
||||||
SUM(d.impressions) as reach,-1 as roas,-1 as be_roas,-1 as revenue, -1 as profit, -1 as delivery')
|
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')
|
->group('c.campaign_id, c.status, c.customer_id, c.campaign_name')
|
||||||
->where(function ($query) use ($keyword) {
|
->where(function ($query) use ($keyword) {
|
||||||
if ($keyword) {
|
if ($keyword) {
|
||||||
@ -219,35 +270,16 @@ class GoogleAdsReportService
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// 如果提供了 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]);
|
$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 [
|
return [
|
||||||
'data' => $campaigns->items(),
|
'data' => $campaigns->items(),
|
||||||
@ -267,13 +299,43 @@ class GoogleAdsReportService
|
|||||||
*/
|
*/
|
||||||
public static function exportCampaignsToExcel($keyword, $dateRange, $startDate = null, $endDate = null)
|
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')
|
$query = Campaign::alias('c')
|
||||||
->leftJoin('bps.bps_google_ad_day_data d', 'c.campaign_id = d.campaign_id')
|
->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,
|
->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,
|
COALESCE(SUM(d.clicks), -1) as clicks,
|
||||||
SUM(d.conversions) as results, SUM(d.conversions_value) as conversions_value,
|
COALESCE(SUM(d.cost_micros) / 1000000, -1) as spend,
|
||||||
SUM(d.impressions) as reach,-1 as roas,-1 as be_roas,-1 as revenue, -1 as profit, -1 as delivery')
|
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')
|
->group('c.campaign_id, c.status, c.customer_id, c.campaign_name')
|
||||||
->where(function ($query) use ($keyword) {
|
->where(function ($query) use ($keyword) {
|
||||||
if ($keyword) {
|
if ($keyword) {
|
||||||
@ -281,33 +343,6 @@ class GoogleAdsReportService
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// 如果提供了 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();
|
$campaigns = $query->select();
|
||||||
|
|
||||||
@ -378,14 +413,44 @@ class GoogleAdsReportService
|
|||||||
*/
|
*/
|
||||||
public static function getAdGroupList($page, $pageSize, $keyword, $dateRange, $startDate = null, $endDate = null)
|
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')
|
$query = AdGroup::alias('ag')
|
||||||
->leftJoin('bps.bps_google_ad_day_data d', 'ag.ad_group_id = d.ad_group_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') // 关联广告系列表
|
->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,
|
->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,
|
COALESCE(SUM(d.clicks), -1) as clicks,
|
||||||
SUM(d.conversions) as results, SUM(d.conversions_value) as conversions_value,
|
COALESCE(SUM(d.cost_micros) / 1000000, -1) as spend,
|
||||||
SUM(d.impressions) as reach,-1 as roas,-1 as be_roas,-1 as revenue, -1 as profit, -1 as delivery')
|
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')
|
->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) {
|
->where(function ($query) use ($keyword) {
|
||||||
if ($keyword) {
|
if ($keyword) {
|
||||||
@ -393,56 +458,22 @@ class GoogleAdsReportService
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// 如果提供了 startDate 和 endDate,则根据范围查询
|
// 获取分页数据
|
||||||
if ($startDate && $endDate) {
|
$adGroups = $query->paginate($pageSize, false, ['page' => $page]);
|
||||||
$query->whereBetween('d.date', [$startDate, $endDate]);
|
// 确保转换为数值
|
||||||
} else {
|
$result = array_map(function ($item) {
|
||||||
// 根据日期维度添加聚合条件
|
$item['spend'] = (float)$item['spend'];
|
||||||
switch ($dateRange) {
|
$item['conversions_value'] = (float)$item['conversions_value'];
|
||||||
case 'Today':
|
return $item;
|
||||||
$query->where('d.date', '=', date('Y-m-d'));
|
}, $adGroups->items());
|
||||||
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 [
|
return [
|
||||||
'data' => $result->items(),
|
'data' => $adGroups->items(),
|
||||||
'total' => $result->total(),
|
'total' => $adGroups->total(),
|
||||||
'current_page' => $result->currentPage(),
|
'current_page' => $adGroups->currentPage(),
|
||||||
'last_page' => $result->lastPage(),
|
'last_page' => $adGroups->lastPage(),
|
||||||
];
|
];
|
||||||
} catch (DbException $e) {
|
|
||||||
// 处理数据库查询错误
|
|
||||||
return [
|
|
||||||
'error' => 'Database query failed: ' . $e->getMessage(),
|
|
||||||
];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -451,48 +482,50 @@ class GoogleAdsReportService
|
|||||||
*/
|
*/
|
||||||
public static function exportAdGroupsToExcel($keyword = '', $dateRange = 'Today', $startDate = null, $endDate = null)
|
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')
|
$query = AdGroup::alias('ag')
|
||||||
->leftJoin('bps.bps_google_ad_day_data d', 'ag.ad_group_id = d.ad_group_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') // 关联广告系列表
|
->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,
|
->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,
|
COALESCE(SUM(d.clicks), -1) as clicks,
|
||||||
SUM(d.conversions) as results, SUM(d.conversions_value) as conversions_value,
|
COALESCE(SUM(d.cost_micros) / 1000000, -1) as spend,
|
||||||
SUM(d.impressions) as reach,-1 as roas,-1 as be_roas,-1 as revenue, -1 as profit, -1 as delivery')
|
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')
|
->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) {
|
->where(function ($query) use ($keyword) {
|
||||||
if ($keyword) {
|
if ($keyword) {
|
||||||
$query->where('ag.ad_group_name', 'like', '%' . $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();
|
$ad_groups = $query->select();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user