UrsTeamRankingCard.php 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. <?php
  2. namespace App\Module\UrsPromotion\AdminControllers\Metrics;
  3. use App\Module\UrsPromotion\Models\UrsUserReferral;
  4. use UCore\DcatAdmin\Metrics\Examples\Ranking;
  5. use Illuminate\Http\Request;
  6. use Illuminate\Support\Facades\DB;
  7. /**
  8. * URS团队排名卡片
  9. * 显示团队推广总数排名前10名(直推+间推+三推)
  10. */
  11. class UrsTeamRankingCard extends Ranking
  12. {
  13. /**
  14. * 初始化卡片内容
  15. */
  16. protected function init()
  17. {
  18. parent::init();
  19. $this->title('团队排行榜');
  20. }
  21. /**
  22. * 处理请求
  23. *
  24. * @param Request $request
  25. * @return mixed|void
  26. */
  27. public function handle(Request $request)
  28. {
  29. $data = $this->getTeamRankingData();
  30. // 卡片内容
  31. $this->withContent($data);
  32. }
  33. /**
  34. * 获取团队排名数据
  35. * 统计每个推荐人的团队总人数(直推+间推+三推)
  36. *
  37. * @return array
  38. */
  39. protected function getTeamRankingData(): array
  40. {
  41. // 使用子查询统计团队总数
  42. $fullTableName = DB::getTablePrefix() . (new UrsUserReferral())->getTable();
  43. $rankings = UrsUserReferral::select([
  44. 'urs_referrer_id',
  45. 'referrer_id',
  46. 'users.username',
  47. DB::raw('(
  48. -- 直推数量
  49. SELECT COUNT(DISTINCT r_direct.urs_user_id)
  50. FROM ' . $fullTableName . ' r_direct
  51. WHERE r_direct.urs_referrer_id = ' . $fullTableName . '.urs_referrer_id
  52. AND r_direct.status = 1
  53. ) + (
  54. -- 间推数量
  55. SELECT COUNT(DISTINCT r_indirect.urs_user_id)
  56. FROM ' . $fullTableName . ' r_level1
  57. JOIN ' . $fullTableName . ' r_indirect ON r_level1.urs_user_id = r_indirect.urs_referrer_id
  58. WHERE r_level1.urs_referrer_id = ' . $fullTableName . '.urs_referrer_id
  59. AND r_level1.status = 1 AND r_indirect.status = 1
  60. ) + (
  61. -- 三推数量
  62. SELECT COUNT(DISTINCT r_third.urs_user_id)
  63. FROM ' . $fullTableName . ' r_level1
  64. JOIN ' . $fullTableName . ' r_level2 ON r_level1.urs_user_id = r_level2.urs_referrer_id
  65. JOIN ' . $fullTableName . ' r_third ON r_level2.urs_user_id = r_third.urs_referrer_id
  66. WHERE r_level1.urs_referrer_id = ' . $fullTableName . '.urs_referrer_id
  67. AND r_level1.status = 1 AND r_level2.status = 1 AND r_third.status = 1
  68. ) as team_count')
  69. ])
  70. ->leftJoin('users', 'urs_promotion_user_referrals.referrer_id', '=', 'users.id')
  71. ->where('urs_promotion_user_referrals.status', UrsUserReferral::STATUS_VALID)
  72. ->groupBy('urs_promotion_user_referrals.urs_referrer_id', 'urs_promotion_user_referrals.referrer_id', 'urs_promotion_user_referrals.urs_user_id', 'users.username')
  73. ->orderBy('team_count', 'desc')
  74. ->limit(10)
  75. ->get();
  76. $result = [];
  77. foreach ($rankings as $index => $ranking) {
  78. $username = $ranking->username ?: 'URS用户' . $ranking->urs_referrer_id;
  79. $result[] = [
  80. 'rank' => $index + 1,
  81. 'title' => $username,
  82. 'number' => $ranking->team_count . ' 人',
  83. ];
  84. }
  85. // 如果没有数据,返回空排名提示
  86. if (empty($result)) {
  87. $result[] = [
  88. 'rank' => '-',
  89. 'title' => '暂无团队数据',
  90. 'number' => '0 人',
  91. ];
  92. }
  93. return $result;
  94. }
  95. }