webman_ad/app/service/GoogleAdsReportService.php

187 lines
6.6 KiB
PHP

<?php
namespace app\service;
use app\model\Ad;
use app\model\DayData;
use app\model\Campaign;
use app\model\AdGroup;
use think\db\exception\DbException;
use think\facade\Db;
use think\model\Collection;
class GoogleAdsReportService
{
/**
* 获取广告列表
*/
public static function getAdList($page, $pageSize, $keyword, $dateRange)
{
// 基础查询:广告表和日数据表联接
$query = Ad::alias('a')
->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(),
];
}
}
}