GameRewardGroupPityCountRepository.php 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. <?php
  2. namespace App\Module\Game\AdminRepositories;
  3. use App\Module\Game\Models\GameRewardGroup;
  4. use App\Module\Game\Models\GameRewardGroupPityCount;
  5. use App\Module\Game\Models\GameRewardItem;
  6. use Dcat\Admin\Form;
  7. use Dcat\Admin\Grid;
  8. use Dcat\Admin\Show;
  9. use UCore\DcatAdmin\GridHelper;
  10. use UCore\DcatAdmin\ShowHelper;
  11. use UCore\DcatAdmin\FormHelper;
  12. use UCore\DcatAdmin\FilterHelper;
  13. /**
  14. * 奖励组保底计数仓库
  15. */
  16. class GameRewardGroupPityCountRepository
  17. {
  18. /**
  19. * 列表页面
  20. *
  21. * @return Grid
  22. */
  23. public function grid(): Grid
  24. {
  25. return Grid::make(GameRewardGroupPityCount::with(['user', 'rewardGroup', 'rewardItem']), function (Grid $grid) {
  26. $grid->column('id', 'ID')->sortable();
  27. $grid->column('user.username', '用户名')
  28. ->link(function ($value) {
  29. return admin_url("users/{$this->user_id}");
  30. });
  31. $grid->column('user_id', '用户ID')->sortable();
  32. $grid->column('rewardGroup.name', '奖励组')
  33. ->link(function ($value) {
  34. return admin_url("game/reward-groups/{$this->reward_group_id}");
  35. });
  36. $grid->column('rewardItem.name', '奖励项')
  37. ->display(function () {
  38. if ($this->rewardItem) {
  39. return $this->rewardItem->name;
  40. }
  41. return '未知奖励项';
  42. });
  43. $grid->column('count', '当前计数')
  44. ->display(function ($value) {
  45. $threshold = $this->pity_threshold;
  46. $percentage = $threshold > 0 ? round(($value / $threshold) * 100, 1) : 0;
  47. $color = $percentage >= 80 ? 'danger' : ($percentage >= 50 ? 'warning' : 'success');
  48. return "<span class='badge badge-{$color}'>{$value} ({$percentage}%)</span>";
  49. });
  50. $grid->column('pity_threshold', '保底阈值')->sortable();
  51. $grid->column('progress', '保底进度')
  52. ->display(function () {
  53. if ($this->pity_threshold <= 0) {
  54. return '<span class="text-muted">未启用</span>';
  55. }
  56. $percentage = round(($this->count / $this->pity_threshold) * 100, 1);
  57. $color = $percentage >= 100 ? 'success' : ($percentage >= 80 ? 'warning' : 'info');
  58. return "<div class='progress' style='height: 20px;'>
  59. <div class='progress-bar bg-{$color}' style='width: {$percentage}%'>
  60. {$percentage}%
  61. </div>
  62. </div>";
  63. });
  64. $grid->column('last_attempt_at', '最后尝试时间')
  65. ->display(function ($value) {
  66. return $value ? $value->format('Y-m-d H:i:s') : '-';
  67. });
  68. $grid->column('last_hit_at', '最后命中时间')
  69. ->display(function ($value) {
  70. return $value ? $value->format('Y-m-d H:i:s') : '-';
  71. });
  72. $grid->column('created_at', '创建时间')->sortable();
  73. $grid->column('updated_at', '更新时间')->sortable();
  74. // 筛选器
  75. $grid->filter(function (Grid\Filter $filter) {
  76. FilterHelper::defaultDateRange($filter);
  77. $filter->equal('user_id', '用户ID');
  78. $filter->like('user.username', '用户名');
  79. $filter->equal('reward_group_id', '奖励组')
  80. ->select(GameRewardGroup::pluck('name', 'id'));
  81. $filter->between('count', '当前计数');
  82. $filter->between('pity_threshold', '保底阈值');
  83. $filter->where(function ($query) {
  84. $query->whereRaw('count >= pity_threshold');
  85. }, '已达保底', 'reached_pity')->checkbox();
  86. });
  87. // 工具栏
  88. GridHelper::defaultToolbar($grid);
  89. // 禁用新增和编辑(这些记录由系统自动管理)
  90. $grid->disableCreateButton();
  91. $grid->disableEditButton();
  92. // 只允许查看详情
  93. $grid->actions(function (Grid\Displayers\Actions $actions) {
  94. $actions->disableEdit();
  95. $actions->disableDelete();
  96. });
  97. // 排序
  98. $grid->model()->orderBy('updated_at', 'desc');
  99. });
  100. }
  101. /**
  102. * 详情页面
  103. *
  104. * @param mixed $id
  105. * @return Show
  106. */
  107. public function detail($id): Show
  108. {
  109. return Show::make($id, GameRewardGroupPityCount::with(['user', 'rewardGroup', 'rewardItem']), function (Show $show) {
  110. ShowHelper::defaultShow($show);
  111. $show->field('id', 'ID');
  112. $show->field('user.username', '用户名')
  113. ->link(function ($value) {
  114. return admin_url("users/{$this->user_id}");
  115. });
  116. $show->field('user_id', '用户ID');
  117. $show->field('rewardGroup.name', '奖励组')
  118. ->link(function ($value) {
  119. return admin_url("game/reward-groups/{$this->reward_group_id}");
  120. });
  121. $show->field('rewardItem.name', '奖励项');
  122. $show->field('count', '当前计数');
  123. $show->field('pity_threshold', '保底阈值');
  124. $show->field('progress', '保底进度')
  125. ->as(function () {
  126. if ($this->pity_threshold <= 0) {
  127. return '未启用保底机制';
  128. }
  129. $percentage = round(($this->count / $this->pity_threshold) * 100, 1);
  130. $status = $percentage >= 100 ? '已达保底' : '未达保底';
  131. return "{$percentage}% ({$status})";
  132. });
  133. $show->field('last_attempt_at', '最后尝试时间');
  134. $show->field('last_hit_at', '最后命中时间');
  135. $show->field('created_at', '创建时间');
  136. $show->field('updated_at', '更新时间');
  137. // 禁用编辑和删除
  138. $show->disableEditButton();
  139. $show->disableDeleteButton();
  140. });
  141. }
  142. /**
  143. * 表单页面(仅用于查看,不允许编辑)
  144. *
  145. * @return Form
  146. */
  147. public function form(): Form
  148. {
  149. return Form::make(GameRewardGroupPityCount::class, function (Form $form) {
  150. FormHelper::defaultForm($form);
  151. $form->display('id', 'ID');
  152. $form->display('user_id', '用户ID');
  153. $form->display('reward_group_id', '奖励组ID');
  154. $form->display('reward_item_id', '奖励项ID');
  155. $form->display('count', '当前计数');
  156. $form->display('pity_threshold', '保底阈值');
  157. $form->display('last_attempt_at', '最后尝试时间');
  158. $form->display('last_hit_at', '最后命中时间');
  159. $form->display('created_at', '创建时间');
  160. $form->display('updated_at', '更新时间');
  161. // 禁用所有操作
  162. $form->disableCreatingCheck();
  163. $form->disableEditingCheck();
  164. $form->disableViewCheck();
  165. });
  166. }
  167. }