defaultChartOptions()) { $this->chartOptions = $options; } $this->init(); } /** * 处理请求 * * @param Request $request * @return mixed|void */ public function handle(Request $request) { $rankings = $this->getPromotionRankings(); $this->withContent($rankings); } /** * 获取推广排名数据 * * @return array */ private function getPromotionRankings(): array { // 获取直推排名前10 $directRanking = $this->getDirectRanking(); // 获取间推排名前10 $indirectRanking = $this->getIndirectRanking(); // 获取三推排名前10 $thirdRanking = $this->getThirdRanking(); // 获取团队总数排名前10 $teamRanking = $this->getTeamRanking(); return [ 'direct' => $directRanking, 'indirect' => $indirectRanking, 'third' => $thirdRanking, 'team' => $teamRanking, ]; } /** * 获取直推排名 * 统计每个推荐人的直接推荐数量 * * @return array */ private function getDirectRanking(): array { return UrsUserReferral::select([ 'urs_promotion_user_referrals.urs_referrer_id', 'urs_promotion_user_referrals.referrer_id', 'users.username as nickname', DB::raw('COUNT(*) as direct_count') ]) ->leftJoin('users', 'urs_promotion_user_referrals.referrer_id', '=', 'users.id') ->where('urs_promotion_user_referrals.status', UrsUserReferral::STATUS_VALID) ->groupBy('urs_promotion_user_referrals.urs_referrer_id', 'urs_promotion_user_referrals.referrer_id', 'users.username') ->orderBy('direct_count', 'desc') ->limit(10) ->get() ->toArray(); } /** * 获取间推排名 * 统计每个推荐人的间接推荐数量(二级推荐) * * @return array */ private function getIndirectRanking(): array { // 暂时返回空数组,间推统计比较复杂 return []; } /** * 获取三推排名 * 统计每个推荐人的三级推荐数量 * * @return array */ private function getThirdRanking(): array { // 暂时返回空数组,三推统计比较复杂 return []; } /** * 获取团队总数排名 * 统计每个推荐人的团队总人数(直推+间推+三推) * * @return array */ private function getTeamRanking(): array { // 团队排名与直推排名相同,统计直推数量 return $this->getDirectRanking(); } /** * 设置卡片内容 * * @param array $rankings 排名数据 * @return $this */ public function withContent(array $rankings) { $directHtml = $this->buildRankingHtml($rankings['direct'], 'direct_count', '直推'); $indirectHtml = $this->buildRankingHtml($rankings['indirect'], 'indirect_count', '间推'); $thirdHtml = $this->buildRankingHtml($rankings['third'], 'third_count', '三推'); $teamHtml = $this->buildRankingHtml($rankings['team'], 'team_count', '团队'); return $this->content( <<
直推排行榜
{$directHtml}
间推排行榜
{$indirectHtml}
三推排行榜
{$thirdHtml}
团队排行榜
{$teamHtml}
HTML ); } /** * 构建排名HTML * * @param array $data 排名数据 * @param string $countField 数量字段 * @param string $type 类型名称 * @return string */ private function buildRankingHtml(array $data, string $countField, string $type): string { if (empty($data)) { return '暂无数据'; } $html = '
'; foreach ($data as $index => $item) { $rank = $index + 1; // 处理数组和对象两种数据格式 $itemArray = is_object($item) ? (array)$item : $item; $nickname = $itemArray['nickname'] ?? 'URS用户' . ($itemArray['urs_referrer_id'] ?? $itemArray['urs_user_id'] ?? ''); $count = $itemArray[$countField] ?? 0; $badgeClass = $rank <= 3 ? 'badge-warning' : 'badge-secondary'; $html .= << {$rank} {$nickname} {$count}
HTML; } $html .= ''; return $html; } }