diff --git a/app/service/AdsInsightService.php b/app/service/AdsInsightService.php index b22a607..91b9384 100644 --- a/app/service/AdsInsightService.php +++ b/app/service/AdsInsightService.php @@ -81,7 +81,7 @@ class AdsInsightService // 添加关键字过滤条件 $query->where(function ($query) use ($keyword, $platformType) { if ($keyword) { - $query->where('c.campaign_name', 'like', '%' . $keyword . '%'); + $query->where('c.name', 'like', '%' . $keyword . '%'); } if ($platformType) { $platformType = (int)$platformType; @@ -585,10 +585,10 @@ class AdsInsightService 'cost_per_purchase' => '$' . number_format($cost_per_purchase, 2) ?: '$0.00', // 格式化销售额$total_purchases_value, 'revenue' => '$' . number_format($total_revenue, 2) ?: '$0.00', // 格式化收入 'total_cost' => '$' . number_format($total_cost, 2) ?: '$0.00', // 格式化总成本 - 'conversion_rate' => '-', // 没有计算逻辑,保持为 '-' - 'net_profit' => '-', // 没有提供 net_profit,保持为 '-' - 'net_profit_margin' => '-', // 没有提供 net_profit_margin,保持为 '-' - 'net_profit_on_ad_spend' => '-', // 没有提供 net_profit_on_ad_spend,保持为 '-' + 'conversion_rate' => $total_clicks == 0 ? '-' : round(($total_purchases / $total_clicks) * 100, 2) . '%', // 转换率 + 'net_profit' => ($total_revenue - $total_cost) >= 0 ? '+$' . number_format($total_revenue - $total_cost, 2) : '-$' . number_format($total_revenue - $total_cost, 2), // 净利润 + 'net_profit_margin' => $total_revenue == 0 ? '-' : round(($total_revenue - $total_cost) / $total_revenue, 2) * 100 . '%', // 净利润率 + 'net_profit_on_ad_spend' => $total_spend == 0 ? '-' : round(($total_revenue - $total_cost) / $total_spend, 2), // 广告支出净利润 'ctr' => $ctr, // CTR 字段 ]; @@ -649,22 +649,94 @@ class AdsInsightService $total_cost = $data['total_cost']; $total_clicks = $data['clicks']; $total_impressions = $data['impressions']; -// $total_adds_to_cart = $data['adds_to_cart']; -// $total_cost_per_atc = $data['cost_per_atc']; -// $total_purchases = $data['purchases']; -// $total_assisted_purchases = $data['assisted_purchases']; -// $total_last_clicked_purchases = $data['last_clicked_purchases']; + + // CTR 的计算:点击率 = 点击数 / 展示数 + $ctr = $data['impressions'] > 0 ? number_format(($data['clicks'] / $data['impressions']) * 100, 2) . '%' : '-'; + // Conversion Rate 的计算:转换率 = 购买数 / 点击数 + $conversion_rate = $data['clicks'] > 0 ? round(($data['purchases'] / $data['clicks']) * 100, 2) . '%' : '-'; + // Net Profit 的计算:净利润 = 收入 - 总成本 + $net_profit = ($data['revenue'] - $data['total_cost']) >= 0 ? '+$' . number_format($data['revenue'] - $data['total_cost'], 2) : '-$' . number_format($data['revenue'] - $data['total_cost'], 2); + // Net Profit Margin 的计算:净利润率 = 净利润 / 收入 + $net_profit_margin = $data['revenue'] > 0 ? round(($data['revenue'] - $data['total_cost']) / $data['revenue'], 2) * 100 . '%' : '-'; + // Net Profit on Ad Spend 的计算:广告支出净利润 = (收入 - 总成本) / 广告支出 + $net_profit_on_ad_spend = $data['spend'] > 0 ? round(($data['revenue'] - $data['total_cost']) / $data['spend'], 2) : '-'; // 计算 ROAS, CTR 和其他需要的字段 - $aggregatedUsers[$userId]['roas'] = $total_spend == 0 ? '-' : round($total_purchases_value / $total_spend, 2); - $aggregatedUsers[$userId]['amount_spend'] = '$' . number_format($total_spend, 2) ?: '$0.00'; - $aggregatedUsers[$userId]['purchases_value'] = '$' . number_format($total_purchases_value, 2) ?: '$0.00'; - $aggregatedUsers[$userId]['cost_per_purchase'] = $data['purchases'] == 0 ? '$0.00' : '$' . number_format($total_purchases_value / $data['purchases'], 2); - $aggregatedUsers[$userId]['revenue'] = '$' . number_format($total_revenue, 2) ?: '$0.00'; - $aggregatedUsers[$userId]['total_cost'] = '$' . number_format($total_cost, 2) ?: '$0.00'; - $aggregatedUsers[$userId]['conversion_rate'] = $total_impressions == 0 ? '-' : round(($total_clicks / $total_impressions) * 100, 2) . '%'; - $aggregatedUsers[$userId]['ctr'] = $total_impressions == 0 ? '-' : round(($total_clicks / $total_impressions) * 100, 2) . '%'; + $aggregatedUsers[$userId]['roas'] = $total_spend == 0 ? '-' : round($total_purchases_value / $total_spend, 2); + $aggregatedUsers[$userId]['amount_spend'] = '$' . number_format($total_spend, 2) ?: '$0.00'; + $aggregatedUsers[$userId]['purchases_value'] = '$' . number_format($total_purchases_value, 2) ?: '$0.00'; + $aggregatedUsers[$userId]['cost_per_purchase'] = $data['purchases'] == 0 ? '$0.00' : '$' . number_format($total_purchases_value / $data['purchases'], 2); + $aggregatedUsers[$userId]['revenue'] = '$' . number_format($total_revenue, 2) ?: '$0.00'; + $aggregatedUsers[$userId]['total_cost'] = '$' . number_format($total_cost, 2) ?: '$0.00'; + $aggregatedUsers[$userId]['conversion_rate'] = $conversion_rate; + $aggregatedUsers[$userId]['ctr'] = $ctr; + $aggregatedUsers[$userId]['net_profit'] = $net_profit; + $aggregatedUsers[$userId]['net_profit_margin'] = $net_profit_margin; + $aggregatedUsers[$userId]['net_profit_on_ad_spend'] = $net_profit_on_ad_spend; } + // 如果 aggregatedUsers 为空,返回默认的数据结构 + if (empty($aggregatedUsers)) { + $emptyUser = []; + $query = ThirdUser::alias('u') + ->cache(false) // 强制不使用缓存 + ->leftJoin('bps.bps_third_user_advertiser a', "u.id = a.doc_") + ->field('u.id as user_id,u.third_type,a.advertiser_name'); + // 添加关键字过滤条件 + $query->where(function ($query) use ($keyword, $platformType) { +// if ($keyword) { +// $query->where('a.advertiser_name', 'like', '%' . $keyword . '%'); +// } + if ($platformType) { + $a = (int)$platformType; + $platformTypeNames = [1=>'facebook',2=>'google',3=>'tiktok']; + $query->where('u.third_type', '=', $platformTypeNames[$a]); + } + }); + + // 获取所有符合条件的数据(不分页) + $allUsers = $query->select()->toArray(); + foreach ($allUsers as $user) { + if (in_array($user['user_id'], $userIds)) { + $emptyUser[] = [ + 'user_id' => $user['user_id'], + 'platform_type' => (int)$platformType, + 'advertiser_name' => $user['advertiser_name'], + 'assisted_purchases' => 0, + 'last_clicked_purchases' => 0, + 'spend' => 0, + 'impressions' => 0, + 'clicks' => 0, + 'adds_to_cart' => 0, + 'cost_per_atc' => 0, + 'purchases' => 0, + 'purchases_value' => 0, + 'revenue' => 0, + 'total_cost' => 0, + 'conversion_rate' => '-', + 'net_profit' => '-', + 'net_profit_margin' => '-', + 'net_profit_on_ad_spend' => '-', + 'ctr' => '-', + ]; + } + } +// dump($allUsers,'222'); + + return [ + 'pagination' => [ + 'startIndex' => ($page - 1) * $pageSize, + 'maxResults' => $pageSize, + 'count' => 0, + 'pageNo' => $page, + 'pageSize' => $pageSize, + 'pages' => 0, + ], + 'statistics' => $statistics, + 'data' => $emptyUser + ]; + } + + // 使用 array_values 移除键名 $dataWithoutKeys = array_values($aggregatedUsers); // 最终分页信息 @@ -996,7 +1068,7 @@ class AdsInsightService $dateObj = \DateTime::createFromFormat('Ymd', $dateStr); // 获取 ISO 周格式 - return $dateObj->format('o-W'). 'W'; + return $dateObj->format('o-W') . 'W'; } /**