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 ? '' : ''; })->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; }); } }