UrsTalentLevelStatsCard.php 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. <?php
  2. namespace App\Module\UrsPromotion\AdminControllers\Metrics;
  3. use App\Module\UrsPromotion\Models\UrsUserTalent;
  4. use App\Module\UrsPromotion\Models\UrsTalentConfig;
  5. use App\Module\UrsPromotion\Enums\UrsTalentLevel;
  6. use Dcat\Admin\Widgets\Card;
  7. use Illuminate\Support\Facades\DB;
  8. /**
  9. * URS达人等级统计卡片
  10. * 显示各个达人等级的人数统计
  11. */
  12. class UrsTalentLevelStatsCard extends Card
  13. {
  14. /**
  15. * 初始化卡片
  16. */
  17. public function __construct()
  18. {
  19. $stats = $this->getTalentLevelStats();
  20. $content = $this->renderStatsContent($stats);
  21. parent::__construct('URS达人等级统计', $content);
  22. }
  23. /**
  24. * 获取达人等级统计数据
  25. *
  26. * @return array
  27. */
  28. protected function getTalentLevelStats(): array
  29. {
  30. // 获取所有启用的达人等级配置
  31. $configs = UrsTalentConfig::where('status', UrsTalentConfig::STATUS_ENABLED)
  32. ->orderBy('level')
  33. ->get()
  34. ->keyBy('level');
  35. // 统计各等级的用户数量
  36. $levelCounts = UrsUserTalent::select('talent_level', DB::raw('COUNT(*) as count'))
  37. ->groupBy('talent_level')
  38. ->get()
  39. ->keyBy('talent_level');
  40. $stats = [];
  41. // 遍历所有等级配置,包括非达人等级
  42. foreach (UrsTalentLevel::cases() as $levelEnum) {
  43. $level = $levelEnum->value;
  44. $config = $configs->get($level);
  45. $count = $levelCounts->get($level)->count ?? 0;
  46. $stats[] = [
  47. 'level' => $level,
  48. 'name' => $levelEnum->getName(),
  49. 'count' => $count,
  50. 'config' => $config,
  51. 'color' => $this->getLevelColor($level),
  52. 'icon' => $this->getLevelIcon($level),
  53. ];
  54. }
  55. return $stats;
  56. }
  57. /**
  58. * 渲染统计内容
  59. *
  60. * @param array $stats
  61. * @return string
  62. */
  63. protected function renderStatsContent(array $stats): string
  64. {
  65. $html = '<div class="row">';
  66. foreach ($stats as $stat) {
  67. $html .= $this->renderLevelCard($stat);
  68. }
  69. $html .= '</div>';
  70. return $html;
  71. }
  72. /**
  73. * 渲染单个等级卡片
  74. *
  75. * @param array $stat
  76. * @return string
  77. */
  78. protected function renderLevelCard(array $stat): string
  79. {
  80. $icon = $stat['icon'];
  81. $name = $stat['name'];
  82. $count = $stat['count'];
  83. $color = $stat['color'];
  84. return <<<HTML
  85. <div class="col-md-4 col-sm-6 mb-3">
  86. <div class="card border-0 shadow-sm h-100">
  87. <div class="card-body text-center p-3">
  88. <div class="mb-2">
  89. <i class="{$icon}" style="font-size: 24px; color: {$color};" aria-hidden="true"></i>
  90. </div>
  91. <h6 class="card-title mb-1">{$name}</h6>
  92. <h4 class="text-primary mb-0">{$count}</h4>
  93. <small class="text-muted">人</small>
  94. </div>
  95. </div>
  96. </div>
  97. HTML;
  98. }
  99. /**
  100. * 获取等级颜色
  101. *
  102. * @param int $level
  103. * @return string
  104. */
  105. protected function getLevelColor(int $level): string
  106. {
  107. return match($level) {
  108. 0 => '#6c757d', // 非达人 - 灰色
  109. 1 => '#28a745', // 初级达人 - 绿色
  110. 2 => '#17a2b8', // 中级达人 - 青色
  111. 3 => '#ffc107', // 高级达人 - 黄色
  112. 4 => '#fd7e14', // 资深达人 - 橙色
  113. 5 => '#dc3545', // 顶级达人 - 红色
  114. default => '#6c757d',
  115. };
  116. }
  117. /**
  118. * 获取等级图标
  119. *
  120. * @param int $level
  121. * @return string
  122. */
  123. protected function getLevelIcon(int $level): string
  124. {
  125. return match($level) {
  126. 0 => 'fa fa-user', // 非达人
  127. 1 => 'fa fa-star', // 初级达人
  128. 2 => 'fa fa-star-half-alt', // 中级达人
  129. 3 => 'fa fa-crown', // 高级达人
  130. 4 => 'fa fa-gem', // 资深达人
  131. 5 => 'fa fa-trophy', // 顶级达人
  132. default => 'fa fa-user',
  133. };
  134. }
  135. /**
  136. * 获取徽章样式类
  137. *
  138. * @param int $level
  139. * @return string
  140. */
  141. protected function getBadgeClass(int $level): string
  142. {
  143. return match($level) {
  144. 0 => 'badge-secondary',
  145. 1 => 'badge-success',
  146. 2 => 'badge-info',
  147. 3 => 'badge-warning',
  148. 4 => 'badge-primary',
  149. 5 => 'badge-danger',
  150. default => 'badge-secondary',
  151. };
  152. }
  153. }