UrsDirectRankingCard.php 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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 UrsDirectRankingCard 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->getDirectRankingData();
  30. // 卡片内容
  31. $this->withContent($data);
  32. }
  33. /**
  34. * 获取直推排名数据
  35. *
  36. * @return array
  37. */
  38. protected function getDirectRankingData(): array
  39. {
  40. // 查询直推排名数据
  41. $rankings = UrsUserReferral::select([
  42. 'urs_promotion_user_referrals.urs_referrer_id',
  43. 'urs_promotion_user_referrals.referrer_id',
  44. 'users.username',
  45. DB::raw('COUNT(*) as direct_count')
  46. ])
  47. ->leftJoin('users', 'urs_promotion_user_referrals.referrer_id', '=', 'users.id')
  48. ->where('urs_promotion_user_referrals.status', UrsUserReferral::STATUS_VALID)
  49. ->groupBy('urs_promotion_user_referrals.urs_referrer_id', 'urs_promotion_user_referrals.referrer_id', 'users.username')
  50. ->orderBy('direct_count', 'desc')
  51. ->limit(10)
  52. ->get();
  53. $result = [];
  54. foreach ($rankings as $index => $ranking) {
  55. $username = $ranking->username ?: 'URS用户' . $ranking->urs_referrer_id;
  56. $result[] = [
  57. 'rank' => $index + 1,
  58. 'title' => $username,
  59. 'number' => $ranking->direct_count . ' 人',
  60. ];
  61. }
  62. // 如果没有数据,返回空排名提示
  63. if (empty($result)) {
  64. $result[] = [
  65. 'rank' => '-',
  66. 'title' => '暂无直推数据',
  67. 'number' => '0 人',
  68. ];
  69. }
  70. return $result;
  71. }
  72. }