PetBattleTeamMemberController.php 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. <?php
  2. namespace App\Module\Pet\AdminControllers;
  3. use App\Module\Pet\Models\PetBattleTeamMember;
  4. use App\Module\Pet\Repositorys\PetBattleTeamMemberRepository;
  5. use Dcat\Admin\Form;
  6. use Dcat\Admin\Grid;
  7. use Dcat\Admin\Show;
  8. use UCore\DcatAdmin\AdminController;
  9. use Spatie\RouteAttributes\Attributes\Resource;
  10. use App\Module\Pet\AdminControllers\Helper\FilterHelper;
  11. use App\Module\Pet\AdminControllers\Helper\FormHelper;
  12. use App\Module\Pet\AdminControllers\Helper\GridHelper;
  13. use App\Module\Pet\AdminControllers\Helper\ShowHelper;
  14. /**
  15. * 宠物争霸赛队伍成员控制器
  16. *
  17. * @package App\Module\Pet\AdminControllers
  18. */
  19. #[Resource('pet-battle-team-members', names: 'dcat.admin.pet-battle-team-members')]
  20. class PetBattleTeamMemberController extends AdminController
  21. {
  22. /**
  23. * 标题
  24. *
  25. * @var string
  26. */
  27. protected $title = '宠物争霸赛队伍成员';
  28. /**
  29. * 列表页
  30. *
  31. * @return Grid
  32. */
  33. protected function grid()
  34. {
  35. return Grid::make(new PetBattleTeamMemberRepository(['team', 'pet']), function (Grid $grid) {
  36. $helper = new GridHelper($grid, $this);
  37. $grid->column('id', 'ID')->sortable();
  38. $grid->column('team.name', '所属队伍');
  39. $grid->column('user_id', '用户ID')->sortable();
  40. $grid->column('pet.name', '宠物名称');
  41. $grid->column('power', '战力贡献')->sortable();
  42. $grid->column('join_time', '加入时间')->sortable();
  43. // 添加是否队长标识
  44. $grid->column('is_leader', '是否队长')->display(function () {
  45. return $this->team && $this->team->leader_id == $this->user_id
  46. ? '<span class="label bg-success">是</span>'
  47. : '<span class="label bg-default">否</span>';
  48. })->label();
  49. // 筛选
  50. $grid->filter(function ($filter) {
  51. $helper = new FilterHelper($filter, $this);
  52. $helper->equal('id', 'ID');
  53. $filter->equal('team_id', '所属队伍')->select(function () {
  54. return \App\Module\Pet\Models\PetBattleTeam::pluck('name', 'id');
  55. });
  56. $filter->equal('user_id', '用户ID');
  57. $helper->equalSelectModelPet('pet_id', '宠物');
  58. $filter->between('power', '战力贡献');
  59. $filter->between('join_time', '加入时间')->datetime();
  60. });
  61. // 默认按战力贡献倒序排序
  62. $grid->model()->orderBy('power', 'desc');
  63. return $grid;
  64. });
  65. }
  66. /**
  67. * 详情页
  68. *
  69. * @param mixed $id
  70. * @return Show
  71. */
  72. protected function detail($id)
  73. {
  74. return Show::make($id, new PetBattleTeamMemberRepository(['team', 'pet', 'user']), function (Show $show) {
  75. $helper = new ShowHelper($show, $this);
  76. $helper->field('id', 'ID');
  77. $show->field('team.name', '所属队伍');
  78. $show->field('team.season.name', '所属赛季');
  79. $show->field('user_id', '用户ID');
  80. $show->field('pet.name', '宠物名称');
  81. $show->field('pet.grade', '宠物品阶')->as(function ($grade) {
  82. $labels = [
  83. 'FIRST' => '一品',
  84. 'SECOND' => '二品',
  85. 'THIRD' => '三品',
  86. 'FOURTH' => '四品',
  87. ];
  88. return $labels[$grade] ?? $grade;
  89. });
  90. $show->field('pet.level', '宠物等级');
  91. $show->field('power', '战力贡献');
  92. $show->field('join_time', '加入时间');
  93. // 显示是否队长
  94. $show->field('is_leader', '是否队长')->as(function () {
  95. return $this->team && $this->team->leader_id == $this->user_id ? '是' : '否';
  96. });
  97. return $show;
  98. });
  99. }
  100. /**
  101. * 表单
  102. *
  103. * @return Form
  104. */
  105. protected function form()
  106. {
  107. return Form::make(new PetBattleTeamMemberRepository(), function (Form $form) {
  108. $helper = new FormHelper($form, $this);
  109. $form->display('id', 'ID');
  110. $form->select('team_id', '所属队伍')
  111. ->options(function () {
  112. return \App\Module\Pet\Models\PetBattleTeam::pluck('name', 'id');
  113. })
  114. ->required();
  115. $form->number('user_id', '用户ID')
  116. ->required()
  117. ->help('用户的ID');
  118. $helper->selectModelPet('pet_id', '宠物')
  119. ->required()
  120. ->help('用户参赛的宠物');
  121. $form->number('power', '战力贡献')
  122. ->min(0)
  123. ->default(0)
  124. ->required()
  125. ->help('宠物的战力贡献值');
  126. $form->datetime('join_time', '加入时间')
  127. ->default(now())
  128. ->required();
  129. // 保存前回调
  130. $form->saving(function (Form $form) {
  131. // 验证用户和宠物的关联性
  132. if ($form->pet_id && $form->user_id) {
  133. $pet = \App\Module\Pet\Models\PetUser::find($form->pet_id);
  134. if ($pet && $pet->user_id != $form->user_id) {
  135. return $form->error('所选宠物不属于该用户');
  136. }
  137. }
  138. // 验证用户在同一赛季中是否已经加入了其他队伍
  139. if ($form->team_id && $form->user_id) {
  140. $team = \App\Module\Pet\Models\PetBattleTeam::find($form->team_id);
  141. if ($team) {
  142. $seasonId = $team->season_id;
  143. $existingMember = PetBattleTeamMember::whereHas('team', function ($query) use ($seasonId) {
  144. $query->where('season_id', $seasonId);
  145. })->where('user_id', $form->user_id)
  146. ->where('id', '!=', $form->model()->id)
  147. ->first();
  148. if ($existingMember) {
  149. return $form->error('该用户已经加入了本赛季的其他队伍');
  150. }
  151. }
  152. }
  153. });
  154. // 保存后回调
  155. $form->saved(function (Form $form) {
  156. // 更新队伍的总战力和成员数量
  157. if ($form->team_id) {
  158. $team = \App\Module\Pet\Models\PetBattleTeam::find($form->team_id);
  159. if ($team) {
  160. $totalPower = PetBattleTeamMember::where('team_id', $team->id)->sum('power');
  161. $memberCount = PetBattleTeamMember::where('team_id', $team->id)->count();
  162. $team->total_power = $totalPower;
  163. $team->member_count = $memberCount;
  164. $team->save();
  165. }
  166. }
  167. });
  168. return $form;
  169. });
  170. }
  171. }