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 UrsUserMapping::select([ 'urs_promotion_user_mappings.urs_user_id', 'urs_promotion_user_mappings.user_id', 'urs_promotion_user_mappings.direct_count', 'users.nickname' ]) ->leftJoin('users', 'urs_promotion_user_mappings.user_id', '=', 'users.id') ->where('urs_promotion_user_mappings.status', UrsUserMapping::STATUS_VALID) ->where('urs_promotion_user_mappings.direct_count', '>', 0) ->orderBy('urs_promotion_user_mappings.direct_count', 'desc') ->limit(10) ->get() ->toArray(); } /** * 获取间推排名 * * @return array */ private function getIndirectRanking(): array { return UrsUserMapping::select([ 'urs_promotion_user_mappings.urs_user_id', 'urs_promotion_user_mappings.user_id', 'urs_promotion_user_mappings.indirect_count', 'users.nickname' ]) ->leftJoin('users', 'urs_promotion_user_mappings.user_id', '=', 'users.id') ->where('urs_promotion_user_mappings.status', UrsUserMapping::STATUS_VALID) ->where('urs_promotion_user_mappings.indirect_count', '>', 0) ->orderBy('urs_promotion_user_mappings.indirect_count', 'desc') ->limit(10) ->get() ->toArray(); } /** * 获取三推排名 * * @return array */ private function getThirdRanking(): array { return UrsUserMapping::select([ 'urs_promotion_user_mappings.urs_user_id', 'urs_promotion_user_mappings.user_id', 'urs_promotion_user_mappings.third_count', 'users.nickname' ]) ->leftJoin('users', 'urs_promotion_user_mappings.user_id', '=', 'users.id') ->where('urs_promotion_user_mappings.status', UrsUserMapping::STATUS_VALID) ->where('urs_promotion_user_mappings.third_count', '>', 0) ->orderBy('urs_promotion_user_mappings.third_count', 'desc') ->limit(10) ->get() ->toArray(); } /** * 获取团队总数排名 * * @return array */ private function getTeamRanking(): array { return UrsUserMapping::select([ 'urs_promotion_user_mappings.urs_user_id', 'urs_promotion_user_mappings.user_id', 'urs_promotion_user_mappings.promotion_count', 'users.nickname' ]) ->leftJoin('users', 'urs_promotion_user_mappings.user_id', '=', 'users.id') ->where('urs_promotion_user_mappings.status', UrsUserMapping::STATUS_VALID) ->where('urs_promotion_user_mappings.promotion_count', '>', 0) ->orderBy('urs_promotion_user_mappings.promotion_count', 'desc') ->limit(10) ->get() ->toArray(); } /** * 设置卡片内容 * * @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'], 'promotion_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; $nickname = $item['nickname'] ?? 'URS用户' . $item['urs_user_id']; $count = $item[$countField] ?? 0; $badgeClass = $rank <= 3 ? 'badge-warning' : 'badge-secondary'; $html .= << {$rank} {$nickname} {$count}
HTML; } $html .= ''; return $html; } }