fix Creative 3

This commit is contained in:
huangguancheng 2025-01-10 20:31:27 +08:00
parent 2577f5df58
commit 408380bf2f

View File

@ -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,