创建前端对接列表接口
This commit is contained in:
parent
781d4792e8
commit
94c6ac12ee
76
app/controller/AdController.php
Normal file
76
app/controller/AdController.php
Normal file
@ -0,0 +1,76 @@
|
||||
<?php
|
||||
|
||||
namespace app\controller;
|
||||
|
||||
use app\service\GoogleAdsReportService;
|
||||
use support\Request;
|
||||
use support\Response;
|
||||
use DI\Annotation\Inject;
|
||||
|
||||
class AdController
|
||||
{
|
||||
|
||||
/**
|
||||
* @Inject
|
||||
* @var GoogleAdsReportService
|
||||
*/
|
||||
private $googleAdsReportService;
|
||||
|
||||
public function listAds(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::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
|
||||
]);
|
||||
}
|
||||
|
||||
}
|
@ -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';
|
||||
|
@ -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';
|
||||
|
@ -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';
|
||||
|
@ -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';
|
||||
|
@ -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'];
|
||||
|
186
app/service/GoogleAdsReportService.php
Normal file
186
app/service/GoogleAdsReportService.php
Normal file
@ -0,0 +1,186 @@
|
||||
<?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(),
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -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']);
|
||||
});
|
||||
|
Loading…
Reference in New Issue
Block a user