fix Creative 3
This commit is contained in:
parent
2577f5df58
commit
408380bf2f
@ -664,169 +664,6 @@ class AdsInsightService
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获取广告资产报告
|
||||
*
|
||||
* @param string $keyword 关键词(广告素材名称模糊搜索)
|
||||
* @param string $dateRange 日期范围:Today, Yesterday, Last Week, Last Month, Last Year
|
||||
* @param string|null $startDate 起始日期(可选)
|
||||
* @param string|null $endDate 结束日期(可选)
|
||||
* @param int $page 当前页码
|
||||
* @param int $pageSize 每页数量
|
||||
* @return array
|
||||
*/
|
||||
public function getCreativeInsightData11111($platformType, $customerIds, $page, $pageSize, $keyword, $startDate = null, $endDate = null)
|
||||
{
|
||||
// 1. 获取符合条件的 ad_id 列表,并且筛选 AssetRelation 的 date 字段
|
||||
$adIdsQuery = AssetRelation::alias('r')
|
||||
->leftJoin('bps.bps_google_ads_asset a', 'r.asset_id = a.asset_id') // 关联资产表
|
||||
->where(function ($query) use ($keyword) {
|
||||
if ($keyword) {
|
||||
$query->where('a.asset_name', 'like', '%' . $keyword . '%'); // 关键词模糊匹配
|
||||
}
|
||||
});
|
||||
|
||||
// 如果提供了 customerIds,增加查询条件
|
||||
if (!empty($customerIds)) {
|
||||
$adIdsQuery->whereIn('a.customer_id', $customerIds); // 添加 customer_id 的查询约束
|
||||
} else {
|
||||
return [
|
||||
'data' => [],
|
||||
'total' => 0,
|
||||
'statistics' => [],
|
||||
'pagination' => [
|
||||
'startIndex' => 0,
|
||||
'maxResults' => $pageSize,
|
||||
'count' => 0,
|
||||
'pageNo' => 1,
|
||||
'pageSize' => $pageSize,
|
||||
'pages' => 1
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
// 日期范围处理,筛选 AssetRelation 的 date 字段
|
||||
if ($startDate && $endDate) {
|
||||
$adIdsQuery->whereBetween('r.date', [$startDate, $endDate]);
|
||||
}
|
||||
|
||||
// 获取唯一的 ad_id 列表
|
||||
$adIds = $adIdsQuery->distinct(true)->column('r.ad_id');
|
||||
|
||||
// 2. 根据 ad_id 和日期范围去查询 DayData 表,按 ad_id 聚合统计
|
||||
$dayDataQuery = DayData::alias('d')
|
||||
->whereIn('d.ad_id', $adIds) // 使用 ad_id 过滤
|
||||
->where(function ($query) use ($startDate, $endDate) {
|
||||
// 日期范围的筛选
|
||||
if ($startDate && $endDate) {
|
||||
$query->whereBetween('d.date', [$startDate, $endDate]);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
$dayDataQuery->group('d.ad_id,d.ad_name, d.ad_resource_name, d.ad_group_id, d.campaign_id, d.customer_id'); // 按 ad_id 聚合
|
||||
$dayDataQuery->field([
|
||||
'd.ad_id',
|
||||
ThinkDb::raw('SUM(d.cost_micros) / 1000000 AS total_spend'),
|
||||
ThinkDb::raw('SUM(d.conversions_value) AS total_conversions_value'),
|
||||
ThinkDb::raw('SUM(d.conversions) AS total_conversions'),
|
||||
ThinkDb::raw('SUM(d.impressions) AS total_impressions'),
|
||||
ThinkDb::raw('SUM(d.clicks) AS total_clicks')
|
||||
]);
|
||||
|
||||
// 获取聚合数据
|
||||
$aggregatedData = $dayDataQuery->select();
|
||||
|
||||
// 3. 获取与 ad_id 关联的 asset_id 以及相关数据
|
||||
$assetRelationsQuery = AssetRelation::whereIn('ad_id', $adIds)
|
||||
->whereBetween('date', [$startDate, $endDate]) // 加上 AssetRelation 的 date 过滤
|
||||
->field(['asset_id', 'ad_id'])->select();
|
||||
|
||||
// 4. 汇总每个 asset_id 下的所有 ad_id 的聚合数据
|
||||
$assetSummaryData = [];
|
||||
$statisticsData = $this->initializeStatistics(); // 初始化统计数据
|
||||
|
||||
foreach ($assetRelationsQuery as $assetRelation) {
|
||||
$adStatsCollection = $aggregatedData->where('ad_id', $assetRelation->ad_id);
|
||||
|
||||
if (!$adStatsCollection->isEmpty()) {
|
||||
if (!isset($assetSummaryData[$assetRelation->asset_id])) {
|
||||
$assetSummaryData[$assetRelation->asset_id] = [
|
||||
'creative_id' => $assetRelation->asset_id,
|
||||
'creative' => '-',
|
||||
'creative_type' => 0,
|
||||
'creative_url' => '-',
|
||||
'spend' => 0,
|
||||
'purchase_value' => '-',
|
||||
'roas' => 0,
|
||||
'cpa' => '-',
|
||||
'cpc_link_click' => '-',
|
||||
'cpm' => '-',
|
||||
'cpc_all' => '-',
|
||||
'aov' => '-',
|
||||
'click_to_atc_ratio' => '-',
|
||||
'atc_to_purchase_ratio' => '-',
|
||||
'purchases' => '-',
|
||||
'first_frame_retention' => '-',
|
||||
'thumbstop' => '-',
|
||||
'ctr_outbound' => '-',
|
||||
'click_to_purchase' => '-',
|
||||
'ctr_all' => '-',
|
||||
'video_plays_25_rate' => '-',
|
||||
'video_plays_50_rate' => '-',
|
||||
'video_plays_75_rate' => '-',
|
||||
'video_plays_100_rate' => '-',
|
||||
'hold_rate' => '-',
|
||||
'total_conversions_value' => 0,
|
||||
'total_conversions' => 0,
|
||||
'total_impressions' => 0,
|
||||
'ad_count' => 0
|
||||
];
|
||||
}
|
||||
|
||||
// 更新每个广告素材的统计数据
|
||||
foreach ($adStatsCollection as $adStats) {
|
||||
$assetSummaryData[$assetRelation->asset_id]['spend'] += $adStats->total_spend;
|
||||
$assetSummaryData[$assetRelation->asset_id]['total_conversions_value'] += $adStats->total_conversions_value;
|
||||
$assetSummaryData[$assetRelation->asset_id]['total_conversions'] += $adStats->total_conversions;
|
||||
$assetSummaryData[$assetRelation->asset_id]['total_impressions'] += $adStats->total_impressions;
|
||||
|
||||
// 汇总 statisticsData
|
||||
$statisticsData['spend'] += $adStats->total_spend;
|
||||
$statisticsData['conversions_value'] += $adStats->total_conversions_value;
|
||||
$statisticsData['total_conversions'] += $adStats->total_conversions;
|
||||
$statisticsData['total_impressions'] += $adStats->total_impressions;
|
||||
}
|
||||
|
||||
// 计算 ROAS
|
||||
$roas = $assetSummaryData[$assetRelation->asset_id]['spend'] > 0 ?
|
||||
$assetSummaryData[$assetRelation->asset_id]['total_conversions_value'] / $assetSummaryData[$assetRelation->asset_id]['spend'] :
|
||||
0;
|
||||
$assetSummaryData[$assetRelation->asset_id]['roas'] = $roas > 0 ? number_format($roas, 2) . 'X' : '-';
|
||||
|
||||
// 填充 ad_count 和 creative_data
|
||||
$assetSummaryData[$assetRelation->asset_id]['ad_count'] = count($adStatsCollection);
|
||||
$assetSummaryData[$assetRelation->asset_id]['creative'] = $adStatsCollection[0]->ad_name; // 假设第一个 ad 的名称作为 creative_name
|
||||
}
|
||||
}
|
||||
|
||||
// 返回分页数据
|
||||
return [
|
||||
'data' => array_values($assetSummaryData),
|
||||
'total' => count($assetSummaryData),
|
||||
'statistics' => $statisticsData, // 汇总的统计数据
|
||||
'pagination' => [
|
||||
'startIndex' => ($page - 1) * $pageSize,
|
||||
'maxResults' => $pageSize,
|
||||
'count' => count($assetSummaryData),
|
||||
'pageNo' => $page,
|
||||
'pageSize' => $pageSize,
|
||||
'pages' => ceil(count($assetSummaryData) / $pageSize)
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
public function getCreativeInsightData($platformType, $customerIds, $page, $pageSize, $keyword, $startDate = null, $endDate = null)
|
||||
{
|
||||
// 1. 创建查询对象,初始化 BpsAdCreativeInsight 查询
|
||||
@ -900,9 +737,9 @@ class AdsInsightService
|
||||
$creativeSummaryData[$creativeData->creative_id] = [
|
||||
'creative_id' => $creativeData->creative_id,
|
||||
'creative' => $creativeData->creative_name, // 使用联接查询中的 creative_name
|
||||
'creative_url' => $creativeData->creative_url, // 使用联接查询中的 creative_url
|
||||
'thumbnail_url' => $creativeData->thumbnail_url, // 使用联接查询中的 thumbnail_url
|
||||
'title' => $creativeData->title, // 使用联接查询中的 title
|
||||
'creative_url' => $creativeData->creative_url?: '', // 使用联接查询中的 creative_url
|
||||
'thumbnail_url' => $creativeData->thumbnail_url?: '', // 使用联接查询中的 thumbnail_url
|
||||
'title' => $creativeData->title?: '', // 使用联接查询中的 title
|
||||
'spend' => 0,
|
||||
'purchase_value' => '-',
|
||||
'roas' => 0,
|
||||
|
Loading…
Reference in New Issue
Block a user