diff --git a/app/controller/AdController.php b/app/controller/AdController.php index 6812ecf..33bb9aa 100644 --- a/app/controller/AdController.php +++ b/app/controller/AdController.php @@ -6,6 +6,7 @@ use app\service\GoogleAdsCampaignService; use app\service\GoogleAdsGroupService; use app\service\GoogleAdsAdService; use app\service\GoogleAdsReportService; +use app\service\GoogleOAuthService; use support\Request; use support\Response; use DI\Annotation\Inject; @@ -38,6 +39,12 @@ class AdController */ private $googleAdsCampaignService; + /** + * @Inject + * @var GoogleOAuthService + */ + private $googleOAuthService; + public function listAds(Request $request) { // 获取请求参数 @@ -57,9 +64,12 @@ class AdController // if ($endDate && !strtotime($endDate)) { // return response()->json(['error' => 'Invalid end date format'], 400); // } - $customerIds = [8452924576,6977154211,1401879025]; +// $customerIds = [8452924576,6977154211,1401879025]; + $customers = $this->googleOAuthService->getGoogleAdCustomers(['refresh_token' => $request->refresh_token]); + $customerIds = array_column($customers, 'customer_id'); +// dump($customers); // 调用 Service 层查询 - $result = $this->googleAdsReportService::getAdList($customerIds,$page, $pageSize, $keyword, $dateRange, $startDate, $endDate); + $result = $this->googleAdsReportService::getAdList($customerIds, $page, $pageSize, $keyword, $dateRange, $startDate, $endDate); return $this->successResponse($result); } @@ -75,7 +85,9 @@ class AdController $startDate = $request->input('start_date', null); // 开始日期,默认为 null $endDate = $request->input('end_date', null); // 结束日期,默认为 null - $customerId = 4060397299; +// $customerId = 4060397299; + $customers = $this->googleOAuthService->getGoogleAdCustomers(['refresh_token' => $request->refresh_token]); + $customerIds = array_column($customers, 'customer_id'); // 你可以进一步验证日期格式(可选) // if ($startDate && !strtotime($startDate)) { @@ -86,7 +98,7 @@ class AdController // } // 调用 Service 层查询 - $result = $this->googleAdsReportService->getAssetConversionData($customerId,$page, $pageSize, $keyword, $dateRange, $startDate, $endDate); + $result = $this->googleAdsReportService->getAssetConversionData($customerIds, $page, $pageSize, $keyword, $dateRange, $startDate, $endDate); return $this->successResponse($result); } @@ -109,9 +121,11 @@ class AdController // if ($endDate && !strtotime($endDate)) { // return response()->json(['error' => 'Invalid end date format'], 400); // } - $customerIds = [8452924576,6977154211,1401879025]; +// $customerIds = [8452924576, 6977154211, 1401879025]; + $customers = $this->googleOAuthService->getGoogleAdCustomers(['refresh_token' => $request->refresh_token]); + $customerIds = array_column($customers, 'customer_id'); // 调用 Service 层查询 - $result = $this->googleAdsReportService::getCampaignList($customerIds,$page, $pageSize, $keyword, $dateRange, $startDate, $endDate); + $result = $this->googleAdsReportService::getCampaignList($customerIds, $page, $pageSize, $keyword, $dateRange, $startDate, $endDate); return $this->successResponse($result); // return $this->errorResponse(300,'授权失败'); } @@ -133,8 +147,10 @@ class AdController // return response()->json(['error' => 'Invalid end date format'], 400); // } + $customers = $this->googleOAuthService->getGoogleAdCustomers(['refresh_token' => $request->refresh_token]); + $customerIds = array_column($customers, 'customer_id'); // 调用 service 层导出数据 - return $this->googleAdsReportService::exportAdListToExcel($keyword, $dateRange, $startDate, $endDate); + return $this->googleAdsReportService::exportAdListToExcel($customerIds, $keyword, $dateRange, $startDate, $endDate); } public function exportCampaignsToExcel(Request $request) @@ -153,9 +169,11 @@ class AdController // if ($endDate && !strtotime($endDate)) { // return response()->json(['error' => 'Invalid end date format'], 400); // } - + $customers = $this->googleOAuthService->getGoogleAdCustomers(['refresh_token' => $request->refresh_token]); + $customerIds = array_column($customers, 'customer_id'); +// dump($customerIds); // 调用 service 层导出数据 - return $this->googleAdsReportService::exportCampaignsToExcel($keyword, $dateRange, $startDate, $endDate); + return $this->googleAdsReportService->exportCampaignsToExcel($customerIds,$keyword, $dateRange, $startDate, $endDate); } public function exportGroupsToExcel(Request $request) @@ -167,6 +185,9 @@ class AdController $startDate = $request->input('start_date', null); // 开始日期,默认为 null $endDate = $request->input('end_date', null); // 结束日期,默认为 null + $customers = $this->googleOAuthService->getGoogleAdCustomers(['refresh_token' => $request->refresh_token]); + $customerIds = array_column($customers, 'customer_id'); + // 你可以进一步验证日期格式(可选) // if ($startDate && !strtotime($startDate)) { // return response()->json(['error' => 'Invalid start date format'], 400); @@ -176,7 +197,7 @@ class AdController // } // 调用 service 层导出数据 - return $this->googleAdsReportService::exportAdGroupsToExcel($keyword, $dateRange, $startDate, $endDate); + return $this->googleAdsReportService->exportAdGroupsToExcel($customerIds,$keyword, $dateRange, $startDate, $endDate); } public function listGroups(Request $request) @@ -198,9 +219,11 @@ class AdController // if ($endDate && !strtotime($endDate)) { // return response()->json(['error' => 'Invalid end date format'], 400); // } -$customerIds = [8452924576,6977154211,1401879025]; +//$customerIds = [8452924576,6977154211,1401879025]; + $customers = $this->googleOAuthService->getGoogleAdCustomers(['refresh_token' => $request->refresh_token]); + $customerIds = array_column($customers, 'customer_id'); // 调用 Service 层查询 - $result = $this->googleAdsReportService::getAdGroupList($customerIds,$page, $pageSize, $keyword, $dateRange, $startDate, $endDate); + $result = $this->googleAdsReportService::getAdGroupList($customerIds, $page, $pageSize, $keyword, $dateRange, $startDate, $endDate); return $this->successResponse($result); } @@ -223,19 +246,19 @@ $customerIds = [8452924576,6977154211,1401879025]; */ public function updateCampaignStatus(Request $request): Response { - $campaignStatus = [ + $campaignStatus = [ 0, // UNSPECIFIED 1, // UNKNOWN 2, // ENABLED 3, // PAUSED 4, // REMOVED ]; - $requestData = $request->all(); // 获取请求数据 - $requestData['refresh_token'] = $request->refresh_token; + $requestData = $request->all(); // 获取请求数据 + $requestData['refresh_token'] = $request->refresh_token; $requestData['login_customer_id'] = $request->login_customer_id; // dump($requestData); - $status = $requestData['status']; + $status = $requestData['status']; if (!in_array($status, $campaignStatus)) { return $this->errorResponse(101, 'status参数错误'); } @@ -303,12 +326,12 @@ $customerIds = [8452924576,6977154211,1401879025]; 4 // REMOVED ]; - $requestData = $request->all(); // 获取请求数据 - $requestData['refresh_token'] = $request->refresh_token; + $requestData = $request->all(); // 获取请求数据 + $requestData['refresh_token'] = $request->refresh_token; $requestData['login_customer_id'] = $request->login_customer_id; // dump($requestData); - $status = $requestData['status']; + $status = $requestData['status']; // $options['bid_micro_amount'] = $options['amount'] * 1000000 < 0 ? 0 : $options['amount'] * 1000000; if (!in_array($status, $adGroupStatus)) { return $this->errorResponse(101, 'status参数错误'); @@ -337,12 +360,12 @@ $customerIds = [8452924576,6977154211,1401879025]; 4 // REMOVED ]; - $requestData = $request->all(); // 获取请求数据 - $requestData['refresh_token'] = $request->refresh_token; + $requestData = $request->all(); // 获取请求数据 + $requestData['refresh_token'] = $request->refresh_token; $requestData['login_customer_id'] = $request->login_customer_id; // dump($requestData); - $status = $requestData['status']; + $status = $requestData['status']; if (!in_array($status, $adStatus)) { return $this->errorResponse(101, 'status参数错误'); } diff --git a/app/service/GoogleAdsReportService.php b/app/service/GoogleAdsReportService.php index 25e99c0..8ea0534 100644 --- a/app/service/GoogleAdsReportService.php +++ b/app/service/GoogleAdsReportService.php @@ -200,8 +200,11 @@ class GoogleAdsReportService * @param string $dateRange * @return void */ - public static function exportAdListToExcel($keyword, $dateRange, $startDate = null, $endDate = null) + public static function exportAdListToExcel($customerIds,$keyword, $dateRange, $startDate = null, $endDate = null) { + if (empty($customerIds)) { + return []; + } // 基础查询:广告表和日数据表联接 $query = Ad::alias('a') ->cache(false) // 强制不使用缓存 @@ -244,6 +247,7 @@ class GoogleAdsReportService COALESCE(SUM(d.impressions), -1) as reach, -1 as roas, -1 as be_roas, -1 as revenue, -1 as profit, -1 as delivery') ->group('a.ad_id, a.ad_name, a.status, a.customer_id, a.ad_group_id, g.ad_group_name, a.campaign_id, c.campaign_name') + ->where('a.customer_id', 'in', $customerIds) ->where(function ($query) use ($keyword) { if ($keyword) { $query->where('a.ad_name', 'like', '%' . $keyword . '%'); @@ -531,8 +535,12 @@ class GoogleAdsReportService * @param string $dateRange * @return void */ - public static function exportCampaignsToExcel($keyword, $dateRange, $startDate = null, $endDate = null) + public function exportCampaignsToExcel($customerIds,$keyword, $dateRange, $startDate = null, $endDate = null) { + if(empty($customerIds)){ + return []; + } + // 动态构建日期条件 $dateCondition = ''; if ($startDate && $endDate) { @@ -571,6 +579,7 @@ class GoogleAdsReportService COALESCE(SUM(d.impressions), -1) as reach, -1 as roas, -1 as be_roas, -1 as revenue, -1 as profit, -1 as delivery') ->group('c.campaign_id, c.status, c.customer_id, c.campaign_name') + ->where('c.customer_id', 'in', $customerIds) ->where(function ($query) use ($keyword) { if ($keyword) { $query->where('c.campaign_name', 'like', '%' . $keyword . '%'); @@ -842,8 +851,11 @@ class GoogleAdsReportService /** * 将广告组数据导出到 Excel 文件 */ - public static function exportAdGroupsToExcel($keyword = '', $dateRange = 'Today', $startDate = null, $endDate = null) + public function exportAdGroupsToExcel($customerIds,$keyword = '', $dateRange = 'Today', $startDate = null, $endDate = null) { + if(empty($customerIds)){ + return []; + } // 动态构建日期条件 $dateCondition = ''; if ($startDate && $endDate) { @@ -883,6 +895,7 @@ class GoogleAdsReportService COALESCE(SUM(d.impressions), -1) as reach, -1 as roas, -1 as be_roas, -1 as revenue, -1 as profit, -1 as delivery') ->group('ag.ad_group_id, ag.ad_group_name, ag.status, ag.campaign_id, c.campaign_name, ag.customer_id') + ->where('ag.customer_id', 'in', $customerIds) // 添加 customerIds 条件 ->where(function ($query) use ($keyword) { if ($keyword) { $query->where('ag.ad_group_name', 'like', '%' . $keyword . '%'); @@ -977,7 +990,7 @@ class GoogleAdsReportService * @param int $pageSize 每页数量 * @return array */ - public function getAssetConversionData($customerId, $page, $pageSize, $keyword, $dateRange, $startDate = null, $endDate = null) + public function getAssetConversionData($customerIds, $page, $pageSize, $keyword, $dateRange, $startDate = null, $endDate = null) { $isSameMonth = true; // 判断是否跨月 @@ -998,7 +1011,20 @@ class GoogleAdsReportService $query->where('a.asset_name', 'like', '%' . $keyword . '%'); // 关键词模糊匹配 } }); - $adIdsQuery->where('a.customer_id', '=', $customerId); + + // 如果提供了 customerIds,增加查询条件 + if (!empty($customerIds)) { + $adIdsQuery->whereIn('a.customer_id', $customerIds); // 添加 customer_id 的查询约束 + } else { + return [ + 'data' => [], + 'chat_1_data' => [], // 返回按月汇总的 chat_data + 'total' => 0, + 'current_page' => 1, + 'last_page' => 1, + ]; + } + // 日期范围处理,筛选 AssetRelation 的 date 字段 if ($startDate && $endDate) { $adIdsQuery->whereBetween('r.date', [$startDate, $endDate]); diff --git a/app/service/GoogleOAuthService.php b/app/service/GoogleOAuthService.php index b823de8..c10da3f 100644 --- a/app/service/GoogleOAuthService.php +++ b/app/service/GoogleOAuthService.php @@ -88,30 +88,30 @@ class GoogleOAuthService } //保存或更新某个主体部广告账号 - public function saveThirdUserAdvertiser($customer_id, $third_user_id,$login_customer_id,$customer) + public function saveThirdUserAdvertiser($customer_id, $third_user_id, $login_customer_id, $customer) { - // 确保 customer_id 和 third_user_id 是字符串 - $customer_id = (string) $customer_id; - $tableName = 'bps_third_user_advertiser'; - $tableName = getenv('DB_PG_SCHEMA') ? getenv('DB_PG_SCHEMA') . '.' . $tableName : 'bps' . $tableName; - $data = [ + // 确保 customer_id 和 third_user_id 是字符串 + $customer_id = (string)$customer_id; + $tableName = 'bps_third_user_advertiser'; + $tableName = getenv('DB_PG_SCHEMA') ? getenv('DB_PG_SCHEMA') . '.' . $tableName : 'bps' . $tableName; + $data = [ 'doc_' => $third_user_id, 'advertiser_id' => $customer_id, 'advertiser_name' => $customer['descriptive_name'], 'google_login_customer_id' => $login_customer_id, ]; - if($customer['manager'] === true){ + if ($customer['manager'] === true) { $data['google_manager'] = 't'; - }else{ + } else { $data['google_manager'] = 'f'; } - if($customer['test_account'] === true){ + if ($customer['test_account'] === true) { $data['google_test_account'] = 't'; - }else{ + } else { $data['google_test_account'] = 'f'; } // dump($data); - $sql = " + $sql = " INSERT INTO {$tableName} (advertiser_id,advertiser_name, doc_,google_login_customer_id,google_manager,google_test_account) VALUES (:advertiser_id, :advertiser_name,:doc_,:google_login_customer_id,:google_manager,:google_test_account) @@ -271,12 +271,24 @@ class GoogleOAuthService */ public function getGoogleAdCustomers($options = []) { - // 获取符合条件的客户ID数组 - $customers = ThirdUserAdvertiser::alias('tua') - ->join('bps.bps_third_user tu', 'tua.doc_ = tu.id') // 连接 bps_third_user 表 - ->where('tu.third_type', 'google') // 筛选 third_type 为 google 的记录 - ->field('CAST(tua.advertiser_id AS BIGINT) as customer_id,tua.google_login_customer_id as login_customer_id,tua.google_test_account as test_account,tua.google_manager as manager, tu.access_token as refresh_token') // 获取 advertiser_id 字段 - ->select(); // 执行查询 + if (!empty($options)) { + $refreshToken = $options['refresh_token']; + // 获取符合条件的客户ID数组 + $customers = ThirdUserAdvertiser::alias('tua') + ->join('bps.bps_third_user tu', 'tua.doc_ = tu.id') // 连接 bps_third_user 表 + ->where('tu.third_type', 'google') // 筛选 third_type 为 google 的记录 + ->where('tu.access_token', $refreshToken) // 筛选 third_type 为 google 的记录 + ->field('CAST(tua.advertiser_id AS BIGINT) as customer_id,tua.google_login_customer_id as login_customer_id,tua.google_test_account as test_account,tua.google_manager as manager, tu.access_token as refresh_token') // 获取 advertiser_id 字段 + ->select(); // 执行查询 + } else { + // 获取符合条件的客户ID数组 + $customers = ThirdUserAdvertiser::alias('tua') + ->join('bps.bps_third_user tu', 'tua.doc_ = tu.id') // 连接 bps_third_user 表 + ->where('tu.third_type', 'google') // 筛选 third_type 为 google 的记录 + ->field('CAST(tua.advertiser_id AS BIGINT) as customer_id,tua.google_login_customer_id as login_customer_id,tua.google_test_account as test_account,tua.google_manager as manager, tu.access_token as refresh_token') // 获取 advertiser_id 字段 + ->select(); // 执行查询 + } + // 如果没有找到符合条件的广告主,抛出异常 if ($customers->isEmpty()) {