From 0ac4027bc99eab99b2749f7978d709de5125b5ac Mon Sep 17 00:00:00 2001 From: huangguancheng Date: Mon, 20 Jan 2025 16:04:29 +0800 Subject: [PATCH] =?UTF-8?q?Accounts=E3=80=81Campaigns=E3=80=81Ad=20Sets=20?= =?UTF-8?q?=E3=80=81Ads=E3=80=81Creatives=20=E6=95=B0=E6=8D=AE=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/service/AdsInsightService.php | 88 +++++++++++++++++-------------- 1 file changed, 47 insertions(+), 41 deletions(-) diff --git a/app/service/AdsInsightService.php b/app/service/AdsInsightService.php index f92ae0e..d0ee10d 100644 --- a/app/service/AdsInsightService.php +++ b/app/service/AdsInsightService.php @@ -200,7 +200,6 @@ class AdsInsightService COALESCE(SUM(d.spend) / 1000000, 0) as spend, COALESCE(SUM(d.impressions), 0) as impressions, COALESCE(SUM(d.adds_to_cart), 0) as adds_to_cart, - COALESCE(SUM(d.cost_per_atc), 0) as cost_per_atc, COALESCE(SUM(d.purchases), 0) as purchases, COALESCE(SUM(d.purchases_value / 1000000), 0) as purchases_value, COALESCE(SUM(d.revenue / 1000000), 0) as revenue, @@ -232,6 +231,7 @@ class AdsInsightService $total_purchases_value = array_sum(array_column($allCampaigns, 'purchases_value')); $total_revenue = array_sum(array_column($allCampaigns, 'revenue')); $total_purchases = array_sum(array_column($allCampaigns, 'purchases')); + $adds_to_cart = array_sum(array_column($allCampaigns, 'adds_to_cart')); $cost_per_purchase = $total_purchases == 0 ? 0 : round($total_spend / $total_purchases, 2); // 汇总统计数据 $statistics = [ @@ -242,7 +242,7 @@ class AdsInsightService 'clicks' => $total_clicks, 'impressions' => $total_impressions, 'adds_to_cart' => array_sum(array_column($allCampaigns, 'adds_to_cart')), - 'cost_per_atc' => array_sum(array_column($allCampaigns, 'cost_per_atc')), + 'cost_per_atc' => $adds_to_cart == 0 ? '-' : '$' . number_format(($total_spend / $adds_to_cart), 2), 'purchases' => array_sum(array_column($allCampaigns, 'purchases')), 'purchases_value' => array_sum(array_column($allCampaigns, 'purchases_value')), 'cost_per_purchase' => '$' . number_format($cost_per_purchase, 2) ?: '$0.00', @@ -289,10 +289,10 @@ class AdsInsightService 'clicks' => $item['clicks'], 'ctr' => $ctr, // CTR 字段 'adds_to_cart' => $item['adds_to_cart'], - 'cost_per_atc' => $item['cost_per_atc'], + 'cost_per_atc' => $item['adds_to_cart'] > 0 ? '$' . number_format(($item['spend'] / $item['adds_to_cart']), 2) : '-', 'purchases' => $item['purchases'], 'purchases_value' => '$' . number_format($item['purchases_value'], 2), // 格式化购买金额 - 'cost_per_purchase' => $item['purchases'] > 0 ? '$' . number_format(($item['spend'] / $item['purchases']), 2) : '$0.00', + 'cost_per_purchase' => $item['purchases'] > 0 ? '$' . number_format(($item['spend'] / $item['purchases']), 2) : '-', 'revenue' => '$' . number_format($item['revenue'], 2), // 格式化收入 'total_cost' => '$' . number_format($item['total_cost'], 2), // 格式化总成本 'conversion_rate' => $conversion_rate, @@ -896,7 +896,6 @@ class AdsInsightService COALESCE(SUM(d.spend) / 1000000, 0) as spend, COALESCE(SUM(d.impressions), 0) as impressions, COALESCE(SUM(d.adds_to_cart), 0) as adds_to_cart, - COALESCE(SUM(d.cost_per_atc), 0) as cost_per_atc, COALESCE(SUM(d.purchases), 0) as purchases, COALESCE(SUM(d.purchases_value / 1000000), 0) as purchases_value, COALESCE(SUM(d.revenue / 1000000), 0) as revenue, @@ -930,6 +929,7 @@ class AdsInsightService $total_purchases_value = array_sum(array_column($allAdsets, 'purchases_value')); $total_revenue = array_sum(array_column($allAdsets, 'revenue')); $total_purchases = array_sum(array_column($allAdsets, 'purchases')); + $adds_to_cart = array_sum(array_column($allAdsets, 'adds_to_cart')); $cost_per_purchase = $total_purchases == 0 ? 0 : round($total_spend / $total_purchases, 2); // 汇总统计数据 @@ -941,7 +941,7 @@ class AdsInsightService 'clicks' => $total_clicks, 'impressions' => array_sum(array_column($allAdsets, 'impressions')), 'adds_to_cart' => array_sum(array_column($allAdsets, 'adds_to_cart')), - 'cost_per_atc' => array_sum(array_column($allAdsets, 'cost_per_atc')), + 'cost_per_atc' => $adds_to_cart == 0 ? '-' : '$' . number_format(($total_spend / $adds_to_cart), 2), 'purchases' => array_sum(array_column($allAdsets, 'purchases')), 'purchases_value' => array_sum(array_column($allAdsets, 'purchases_value')), 'cost_per_purchase' => '$' . number_format($cost_per_purchase, 2) ?: '$0.00', @@ -987,10 +987,10 @@ class AdsInsightService 'clicks' => $item['clicks'], 'ctr' => $ctr, // CTR 字段 'adds_to_cart' => $item['adds_to_cart'], - 'cost_per_atc' => $item['cost_per_atc'], + 'cost_per_atc' => $item['adds_to_cart'] > 0 ? '$' . number_format(($item['spend'] / $item['adds_to_cart']), 2) : '-', 'purchases' => $item['purchases'], 'purchases_value' => '$' . number_format($item['purchases_value'], 2), // 格式化购买金额 - 'cost_per_purchase' => $item['purchases'] > 0 ? '$' . number_format(($item['spend'] / $item['purchases']), 2) : '$0.00', + 'cost_per_purchase' => $item['purchases'] > 0 ? '$' . number_format(($item['spend'] / $item['purchases']), 2) : '-', 'revenue' => '$' . number_format($item['revenue'], 2), // 格式化收入 'total_cost' => '$' . number_format($item['total_cost'], 2), // 格式化总成本 'conversion_rate' => $conversion_rate, // 没有提供有效的计算,保持为 '-' @@ -1192,7 +1192,6 @@ class AdsInsightService COALESCE(SUM(d.spend) / 1000000, 0) as spend, COALESCE(SUM(d.impressions), 0) as impressions, COALESCE(SUM(d.adds_to_cart), 0) as adds_to_cart, - COALESCE(SUM(d.cost_per_atc), 0) as cost_per_atc, COALESCE(SUM(d.purchases), 0) as purchases, COALESCE(SUM(d.purchases_value) / 1000000, 0) as purchases_value, COALESCE(SUM(d.revenue) / 1000000, 0) as revenue, @@ -1228,6 +1227,7 @@ class AdsInsightService $total_purchases_value = array_sum(array_column($allAccounts, 'purchases_value')); $total_revenue = array_sum(array_column($allAccounts, 'revenue')); $total_purchases = array_sum(array_column($allAccounts, 'purchases')); + $adds_to_cart = array_sum(array_column($allAccounts, 'adds_to_cart')); $cost_per_purchase = $total_purchases == 0 ? 0 : round($total_spend / $total_purchases, 2); $statistics = [ @@ -1238,7 +1238,7 @@ class AdsInsightService 'clicks' => $total_clicks, 'impressions' => array_sum(array_column($allAccounts, 'impressions')), 'adds_to_cart' => array_sum(array_column($allAccounts, 'adds_to_cart')), - 'cost_per_atc' => array_sum(array_column($allAccounts, 'cost_per_atc')), + 'cost_per_atc' => $adds_to_cart == 0 ? '-' : '$' . number_format(($total_spend / $adds_to_cart), 2), 'purchases' => array_sum(array_column($allAccounts, 'purchases')), 'purchases_value' => array_sum(array_column($allAccounts, 'purchases_value')), 'cost_per_purchase' => '$' . number_format($cost_per_purchase, 2) ?: '$0.00', @@ -1286,10 +1286,10 @@ class AdsInsightService 'clicks' => $item['clicks'], 'ctr' => $ctr, // CTR 字段 'adds_to_cart' => $item['adds_to_cart'], - 'cost_per_atc' => $item['cost_per_atc'], + 'cost_per_atc' => $item['adds_to_cart'] > 0 ? '$' . number_format(($item['spend'] / $item['adds_to_cart']), 2) : '-', 'purchases' => $item['purchases'], 'purchases_value' => '$' . number_format($item['purchases_value'], 2), // 格式化购买金额 - 'cost_per_purchase' => $item['purchases'] > 0 ? '$' . number_format(($item['spend'] / $item['purchases']), 2) : '$0.00', + 'cost_per_purchase' => $item['purchases'] > 0 ? '$' . number_format(($item['spend'] / $item['purchases']), 2) : '-', 'revenue' => '$' . number_format($item['revenue'], 2), // 格式化收入 'total_cost' => '$' . number_format($item['total_cost'], 2), // 格式化总成本 'conversion_rate' => $conversion_rate, @@ -1361,7 +1361,6 @@ class AdsInsightService COALESCE(SUM(d.spend) / 1000000, 0) as spend, COALESCE(SUM(d.impressions), 0) as impressions, COALESCE(SUM(d.adds_to_cart), 0) as adds_to_cart, - COALESCE(SUM(d.cost_per_atc), 0) as cost_per_atc, COALESCE(SUM(d.purchases), 0) as purchases, COALESCE(SUM(d.purchases_value) / 1000000, 0) as purchases_value, COALESCE(SUM(d.revenue) / 1000000, 0) as revenue, @@ -1396,6 +1395,7 @@ class AdsInsightService $total_purchases_value = array_sum(array_column($allAds, 'purchases_value')); $total_revenue = array_sum(array_column($allAds, 'revenue')); $total_purchases = array_sum(array_column($allAds, 'purchases')); + $adds_to_cart = array_sum(array_column($allAds, 'adds_to_cart')); $cost_per_purchase = $total_purchases == 0 ? 0 : round($total_spend / $total_purchases, 2); $statistics = [ @@ -1406,7 +1406,7 @@ class AdsInsightService 'clicks' => $total_clicks, 'impressions' => array_sum(array_column($allAds, 'impressions')), 'adds_to_cart' => array_sum(array_column($allAds, 'adds_to_cart')), - 'cost_per_atc' => array_sum(array_column($allAds, 'cost_per_atc')), + 'cost_per_atc' => $adds_to_cart == 0 ? '-' : '$' . number_format(($total_spend / $adds_to_cart), 2), 'purchases' => array_sum(array_column($allAds, 'purchases')), 'purchases_value' => array_sum(array_column($allAds, 'purchases_value')), 'cost_per_purchase' => '$' . number_format($cost_per_purchase, 2) ?: '$0.00', @@ -1454,10 +1454,10 @@ class AdsInsightService 'clicks' => $item['clicks'], 'ctr' => $ctr, // CTR 字段 'adds_to_cart' => $item['adds_to_cart'], - 'cost_per_atc' => $item['cost_per_atc'], + 'cost_per_atc' => $item['adds_to_cart'] > 0 ? '$' . number_format(($item['spend'] / $item['adds_to_cart']), 2) : '-', 'purchases' => $item['purchases'], 'purchases_value' => '$' . number_format($item['purchases_value'], 2), // 格式化购买金额 - 'cost_per_purchase' => $item['purchases'] > 0 ? '$' . number_format(($item['spend'] / $item['purchases']), 2) : '$0.00', + 'cost_per_purchase' => $item['purchases'] > 0 ? '$' . number_format(($item['spend'] / $item['purchases']), 2) : '-', 'revenue' => '$' . number_format($item['revenue'], 2), // 格式化收入 'total_cost' => '$' . number_format($item['total_cost'], 2), // 格式化总成本 'conversion_rate' => $conversion_rate, @@ -1823,6 +1823,9 @@ class AdsInsightService ThinkDb::raw('COALESCE(SUM(i.revenue) / 1000000, 0) AS total_revenue'), ThinkDb::raw('COALESCE(SUM(i.impressions), 0) AS total_impressions'), ThinkDb::raw('COALESCE(SUM(i.clicks), 0) AS total_clicks'), + ThinkDb::raw('COALESCE(SUM(i.link_clicks), 0) AS total_link_clicks'), + ThinkDb::raw('COALESCE(SUM(i.adds_to_cart), 0) AS total_adds_to_cart'), + ThinkDb::raw('COALESCE(SUM(i.outbound_clicks), 0) AS total_outbound_clicks'), ThinkDb::raw('COALESCE(SUM(i.video_25),0) AS video_plays_25_rate'), ThinkDb::raw('COALESCE(SUM(i.video_50),0) AS video_plays_50_rate'), ThinkDb::raw('COALESCE(SUM(i.video_75),0) AS video_plays_75_rate'), @@ -1887,6 +1890,9 @@ class AdsInsightService 'total_conversions' => 0, 'impressions' => 0, 'clicks' => 0, + 'link_clicks' => 0, + 'outbound_clicks' => 0, + 'adds_to_cart' => 0, 'revenue' => 0, 'ad_count' => 0 ]; @@ -1898,17 +1904,14 @@ class AdsInsightService $creativeSummaryData[$creativeId]['purchases'] += $creativeData['total_purchases']; $creativeSummaryData[$creativeId]['impressions'] += $creativeData['total_impressions']; $creativeSummaryData[$creativeId]['clicks'] += $creativeData['total_clicks']; + $creativeSummaryData[$creativeId]['link_clicks'] += $creativeData['total_link_clicks']; + $creativeSummaryData[$creativeId]['outbound_clicks'] += $creativeData['total_outbound_clicks']; + $creativeSummaryData[$creativeId]['adds_to_cart'] += $creativeData['total_adds_to_cart']; $creativeSummaryData[$creativeId]['revenue'] += $creativeData['total_revenue']; $creativeSummaryData[$creativeId]['video_plays_25_rate'] += $creativeData['video_plays_25_rate']; $creativeSummaryData[$creativeId]['video_plays_50_rate'] += $creativeData['video_plays_50_rate']; $creativeSummaryData[$creativeId]['video_plays_75_rate'] += $creativeData['video_plays_75_rate']; $creativeSummaryData[$creativeId]['video_plays_100_rate'] += $creativeData['video_plays_100_rate']; - // 计算 ROAS - $roas = $creativeSummaryData[$creativeId]['spend'] > 0 - ? $creativeSummaryData[$creativeId]['revenue'] / $creativeSummaryData[$creativeId]['spend'] - : 0; - $creativeSummaryData[$creativeId]['roas'] = $roas > 0 ? number_format($roas, 2) . 'X' : '-'; - // 填充广告计数 // $creativeSummaryData[$creativeData->creative_id]['ad_count'] = rand(10, 200); // 每个 creative_id 对应一个广告 } @@ -1920,24 +1923,27 @@ class AdsInsightService $statisticsData['purchases'] = array_sum(array_column($creativeSummaryData, 'purchases')); $statisticsData['impressions'] = array_sum(array_column($creativeSummaryData, 'impressions')); $statisticsData['clicks'] = array_sum(array_column($creativeSummaryData, 'clicks')); + $statisticsData['link_clicks'] = array_sum(array_column($creativeSummaryData, 'link_clicks')); + $statisticsData['outbound_clicks'] = array_sum(array_column($creativeSummaryData, 'outbound_clicks')); + $statisticsData['adds_to_cart'] = array_sum(array_column($creativeSummaryData, 'adds_to_cart')); $statisticsData['revenue'] = array_sum(array_column($creativeSummaryData, 'revenue')); // 汇总统计数据 $statistics = [ 'spend' => '$' . number_format($statisticsData['spend'], 2), // 格式化金额 'purchases_value' => '$' . number_format($statisticsData['purchases_value'], 2), // 格式化金额 'roas' => $statisticsData['spend'] == 0 ? '-' : round($statisticsData['revenue'] / $statisticsData['spend'], 2) . 'X', - 'cpa' => '-', // 格式化金额 - 'cpc_link_click' => '-', // 格式化金额 - 'cpm' => '-', // 格式化金额 - 'cpc_all' => '-', //格式化金额 - 'aov' => '-', // 格式化金额 - 'click_to_atc_ratio' => '-', // 格式化百分比 - 'atc_to_purchase_ratio' => '-',// 格式化百分比 + 'cpa' => $statisticsData['purchases'] == 0 ? '-' : '$' . number_format($statisticsData['spend'] / $statisticsData['purchases'], 2), + 'cpc_link_click' => $statisticsData['link_clicks'] == 0 ? '-' : '$' . number_format($statisticsData['spend'] / $statisticsData['link_clicks'], 2), + 'cpm' => $statisticsData['impressions'] == 0 ? '-' : '$' . number_format($statisticsData['spend'] * 1000 / $statisticsData['impressions'], 2), // sum(spend) * 1000 / sum(Impression) + 'cpc_all' => $statisticsData['clicks'] == 0 ? '-' : '$' . number_format($statisticsData['spend'] / $statisticsData['clicks'], 2), + 'aov' => $statisticsData['purchases'] == 0 ? '-' : '$' . number_format($statisticsData['purchases_value'] / $statisticsData['purchases'], 2), // 格式化金额 + 'click_to_atc_ratio' => ($statisticsData['clicks'] > 0) ? number_format(($statisticsData['adds_to_cart'] / $statisticsData['clicks']) * 100, 2) . '%' : '-', + 'atc_to_purchase_ratio' => ($statisticsData['adds_to_cart'] > 0) ? number_format(($statisticsData['purchases'] / $statisticsData['adds_to_cart']) * 100, 2) . '%' : '-', 'purchases' => $statisticsData['purchases'], 'first_frame_retention' => '-', 'thumbstop' => '-', - 'ctr_outbound' => '-', - 'click_to_purchase' => '-', + 'ctr_outbound' => ($statisticsData['impressions'] > 0) ? number_format(($statisticsData['outbound_clicks'] / $statisticsData['impressions']) * 100, 2) . '%' : '-', // 格式化为百分比 + 'click_to_purchase' => ($statisticsData['purchases'] > 0) ? number_format(($statisticsData['outbound_clicks'] / $statisticsData['purchases']) * 100, 2) . '%' : '-', 'ctr_all' => ($statisticsData['impressions'] > 0) ? number_format(($statisticsData['clicks'] / $statisticsData['impressions']) * 100, 2) . '%' : '-', // 格式化为百分比 'video_plays_25_rate' => array_sum(array_column($creativeSummaryData, 'video_plays_25_rate')), 'video_plays_50_rate' => array_sum(array_column($creativeSummaryData, 'video_plays_50_rate')), @@ -1995,19 +2001,19 @@ class AdsInsightService 'thumbnail_url' => $item['thumbnail_url'], 'spend' => '$' . number_format($item['spend'], 2), 'purchases_value' => '$' . number_format($item['purchases_value'], 2), - 'roas' => $item['roas'], - 'cpa' => '-', - 'cpc_link_click' => '-', - 'cpm' => '-', - 'cpc_all' => '-', - 'aov' => '-', - 'click_to_atc_ratio' => '-', - 'atc_to_purchase_ratio' => '-', + 'roas' => $item['spend'] == 0 ? '-' : round($item['revenue'] / $item['spend'], 2) . 'X', + 'cpa' => $item['purchases'] == 0 ? '-' : '$' . number_format($item['spend'] / $item['purchases'], 2), + 'cpc_link_click' => $item['link_clicks'] == 0 ? '-' : '$' . number_format($item['spend'] / $item['link_clicks'], 2), + 'cpm' => $item['impressions'] == 0 ? '-' : '$' . number_format($item['spend'] * 1000 / $item['impressions'], 2), + 'cpc_all' => $item['clicks'] == 0 ? '-' : '$' . number_format($item['spend'] / $item['clicks'], 2), + 'aov' => $item['purchases'] == 0 ? '-' : '$' . number_format($item['purchases_value'] / $item['purchases'], 2), + 'click_to_atc_ratio' => ($item['clicks'] > 0) ? number_format(($item['adds_to_cart'] / $item['clicks']) * 100, 2) . '%' : '-', + 'atc_to_purchase_ratio' => ($item['adds_to_cart'] > 0) ? number_format(($item['purchases'] / $item['adds_to_cart']) * 100, 2) . '%' : '-', 'purchases' => $item['purchases'], 'first_frame_retention' => '-', 'thumbstop' => '-', - 'ctr_outbound' => '-', - 'click_to_purchase' => '-', + 'ctr_outbound' => ($item['impressions'] > 0) ? number_format(($item['outbound_clicks'] / $item['impressions']) * 100, 2) . '%' : '-', // 格式化为百分比 + 'click_to_purchase' => ($item['purchases'] > 0) ? number_format(($item['outbound_clicks'] / $item['purchases']) * 100, 2) . '%' : '-', 'ctr_all' => ($item['impressions'] > 0) ? number_format(($item['clicks'] / $item['impressions']) * 100, 2) . '%' : '-', 'total_conversions_value' => '$' . number_format($item['purchases_value'], 2), //准备删除 'impressions' => $item['impressions'],