| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- <?php
- namespace App\Module\UrsPromotion\AdminControllers\Metrics;
- use App\Module\UrsPromotion\Models\UrsUserReferral;
- use UCore\DcatAdmin\Metrics\Examples\Ranking;
- use Illuminate\Http\Request;
- use Illuminate\Support\Facades\DB;
- /**
- * URS团队排名卡片
- * 显示团队推广总数排名前10名(直推+间推+三推)
- */
- class UrsTeamRankingCard extends Ranking
- {
- /**
- * 初始化卡片内容
- */
- protected function init()
- {
- parent::init();
-
- $this->title('团队排行榜');
- }
- /**
- * 处理请求
- *
- * @param Request $request
- * @return mixed|void
- */
- public function handle(Request $request)
- {
- $data = $this->getTeamRankingData();
-
- // 卡片内容
- $this->withContent($data);
- }
- /**
- * 获取团队排名数据
- * 统计每个推荐人的团队总人数(直推+间推+三推)
- *
- * @return array
- */
- protected function getTeamRankingData(): array
- {
- // 使用子查询统计团队总数
- $fullTableName = DB::getTablePrefix() . (new UrsUserReferral())->getTable();
- $rankings = UrsUserReferral::select([
- 'urs_referrer_id',
- 'referrer_id',
- 'users.username',
- DB::raw('(
- -- 直推数量
- SELECT COUNT(DISTINCT r_direct.urs_user_id)
- FROM ' . $fullTableName . ' r_direct
- WHERE r_direct.urs_referrer_id = ' . $fullTableName . '.urs_referrer_id
- AND r_direct.status = 1
- ) + (
- -- 间推数量
- SELECT COUNT(DISTINCT r_indirect.urs_user_id)
- FROM ' . $fullTableName . ' r_level1
- JOIN ' . $fullTableName . ' r_indirect ON r_level1.urs_user_id = r_indirect.urs_referrer_id
- WHERE r_level1.urs_referrer_id = ' . $fullTableName . '.urs_referrer_id
- AND r_level1.status = 1 AND r_indirect.status = 1
- ) + (
- -- 三推数量
- SELECT COUNT(DISTINCT r_third.urs_user_id)
- FROM ' . $fullTableName . ' r_level1
- JOIN ' . $fullTableName . ' r_level2 ON r_level1.urs_user_id = r_level2.urs_referrer_id
- JOIN ' . $fullTableName . ' r_third ON r_level2.urs_user_id = r_third.urs_referrer_id
- WHERE r_level1.urs_referrer_id = ' . $fullTableName . '.urs_referrer_id
- AND r_level1.status = 1 AND r_level2.status = 1 AND r_third.status = 1
- ) as team_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', 'urs_promotion_user_referrals.urs_user_id', 'users.username')
- ->orderBy('team_count', 'desc')
- ->limit(10)
- ->get();
- $result = [];
- foreach ($rankings as $index => $ranking) {
- $username = $ranking->username ?: 'URS用户' . $ranking->urs_referrer_id;
- $result[] = [
- 'rank' => $index + 1,
- 'title' => $username,
- 'number' => $ranking->team_count . ' 人',
- ];
- }
- // 如果没有数据,返回空排名提示
- if (empty($result)) {
- $result[] = [
- 'rank' => '-',
- 'title' => '暂无团队数据',
- 'number' => '0 人',
- ];
- }
- return $result;
- }
- }
|