| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- <?php
- namespace App\Module\Pet\AdminControllers;
- use App\Module\Pet\Models\PetBattleTeamMember;
- use App\Module\Pet\Repositorys\PetBattleTeamMemberRepository;
- use Dcat\Admin\Form;
- use Dcat\Admin\Grid;
- use Dcat\Admin\Show;
- use UCore\DcatAdmin\AdminController;
- use Spatie\RouteAttributes\Attributes\Resource;
- use App\Module\Pet\AdminControllers\Helper\FilterHelper;
- use App\Module\Pet\AdminControllers\Helper\FormHelper;
- use App\Module\Pet\AdminControllers\Helper\GridHelper;
- use App\Module\Pet\AdminControllers\Helper\ShowHelper;
- /**
- * 宠物争霸赛队伍成员控制器
- *
- * @package App\Module\Pet\AdminControllers
- */
- #[Resource('pet-battle-team-members', names: 'dcat.admin.pet-battle-team-members')]
- class PetBattleTeamMemberController extends AdminController
- {
- /**
- * 标题
- *
- * @var string
- */
- protected $title = '宠物争霸赛队伍成员';
- /**
- * 列表页
- *
- * @return Grid
- */
- protected function grid()
- {
- return Grid::make(new PetBattleTeamMemberRepository(['team', 'pet']), function (Grid $grid) {
- $helper = new GridHelper($grid, $this);
- $grid->column('id', 'ID')->sortable();
- $grid->column('team.name', '所属队伍');
- $grid->column('user_id', '用户ID')->sortable();
- $grid->column('pet.name', '宠物名称');
- $grid->column('power', '战力贡献')->sortable();
- $grid->column('join_time', '加入时间')->sortable();
- // 添加是否队长标识
- $grid->column('is_leader', '是否队长')->display(function () {
- return $this->team && $this->team->leader_id == $this->user_id
- ? '<span class="label bg-success">是</span>'
- : '<span class="label bg-default">否</span>';
- })->label();
- // 筛选
- $grid->filter(function ($filter) {
- $helper = new FilterHelper($filter, $this);
- $helper->equal('id', 'ID');
- $filter->equal('team_id', '所属队伍')->select(function () {
- return \App\Module\Pet\Models\PetBattleTeam::pluck('name', 'id');
- });
- $filter->equal('user_id', '用户ID');
- $helper->equalSelectModelPet('pet_id', '宠物');
- $filter->between('power', '战力贡献');
- $filter->between('join_time', '加入时间')->datetime();
- });
- // 默认按战力贡献倒序排序
- $grid->model()->orderBy('power', 'desc');
- return $grid;
- });
- }
- /**
- * 详情页
- *
- * @param mixed $id
- * @return Show
- */
- protected function detail($id)
- {
- return Show::make($id, new PetBattleTeamMemberRepository(['team', 'pet', 'user']), function (Show $show) {
- $helper = new ShowHelper($show, $this);
- $helper->field('id', 'ID');
- $show->field('team.name', '所属队伍');
- $show->field('team.season.name', '所属赛季');
- $show->field('user_id', '用户ID');
- $show->field('pet.name', '宠物名称');
- $show->field('pet.grade', '宠物品阶')->as(function ($grade) {
- $labels = [
- 'FIRST' => '一品',
- 'SECOND' => '二品',
- 'THIRD' => '三品',
- 'FOURTH' => '四品',
- ];
- return $labels[$grade] ?? $grade;
- });
- $show->field('pet.level', '宠物等级');
- $show->field('power', '战力贡献');
- $show->field('join_time', '加入时间');
- // 显示是否队长
- $show->field('is_leader', '是否队长')->as(function () {
- return $this->team && $this->team->leader_id == $this->user_id ? '是' : '否';
- });
- return $show;
- });
- }
- /**
- * 表单
- *
- * @return Form
- */
- protected function form()
- {
- return Form::make(new PetBattleTeamMemberRepository(), function (Form $form) {
- $helper = new FormHelper($form, $this);
- $form->display('id', 'ID');
- $form->select('team_id', '所属队伍')
- ->options(function () {
- return \App\Module\Pet\Models\PetBattleTeam::pluck('name', 'id');
- })
- ->required();
- $form->number('user_id', '用户ID')
- ->required()
- ->help('用户的ID');
- $helper->selectModelPet('pet_id', '宠物')
- ->required()
- ->help('用户参赛的宠物');
- $form->number('power', '战力贡献')
- ->min(0)
- ->default(0)
- ->required()
- ->help('宠物的战力贡献值');
- $form->datetime('join_time', '加入时间')
- ->default(now())
- ->required();
- // 保存前回调
- $form->saving(function (Form $form) {
- // 验证用户和宠物的关联性
- if ($form->pet_id && $form->user_id) {
- $pet = \App\Module\Pet\Models\PetUser::find($form->pet_id);
- if ($pet && $pet->user_id != $form->user_id) {
- return $form->error('所选宠物不属于该用户');
- }
- }
- // 验证用户在同一赛季中是否已经加入了其他队伍
- if ($form->team_id && $form->user_id) {
- $team = \App\Module\Pet\Models\PetBattleTeam::find($form->team_id);
- if ($team) {
- $seasonId = $team->season_id;
- $existingMember = PetBattleTeamMember::whereHas('team', function ($query) use ($seasonId) {
- $query->where('season_id', $seasonId);
- })->where('user_id', $form->user_id)
- ->where('id', '!=', $form->model()->id)
- ->first();
- if ($existingMember) {
- return $form->error('该用户已经加入了本赛季的其他队伍');
- }
- }
- }
- });
- // 保存后回调
- $form->saved(function (Form $form) {
- // 更新队伍的总战力和成员数量
- if ($form->team_id) {
- $team = \App\Module\Pet\Models\PetBattleTeam::find($form->team_id);
- if ($team) {
- $totalPower = PetBattleTeamMember::where('team_id', $team->id)->sum('power');
- $memberCount = PetBattleTeamMember::where('team_id', $team->id)->count();
- $team->total_power = $totalPower;
- $team->member_count = $memberCount;
- $team->save();
- }
- }
- });
- return $form;
- });
- }
- }
|