baseCRUD()->tableLayout('fixed') ->headerToolbar([ $this->createTypeButton('drawer', 'lg'), ...$this->baseHeaderToolBar(), ]) ->filter($this->baseFilter()->labelWidth('80px')->body([ amis()->GroupControl()->mode('horizontal')->body([ amis()->TextControl('id', __('admin.id'))->columnRatio(3) ->placeholder(__('admin.id')), amis()->TextControl('name', __('admin.activities.name'))->columnRatio(3) ->placeholder(__('admin.activities.name')), ]), ])) ->itemCheckableOn('${state === 0}') ->columns([ amis()->TableColumn('id', __('admin.id'))->width('50px')->sortable(), amis()->TableColumn('name', __('admin.activities.name')), amis()->TableColumn('state', __('admin.activities.state'))->type('mapping')->map([ "0"=>"未发布", "1"=>"进行中", "2"=>"已结束", "*"=> '其他:${state}' ]), amis()->TableColumn('logs_count', __('admin.activities.user_count')), amis()->TableColumn('start_at', __('admin.activities.start_at'))->type('datetime'), amis()->TableColumn('end_at', __('admin.activities.end_at'))->type('datetime'), amis()->TableColumn('created_at', __('admin.created_at'))->type('datetime')->sortable(true), Operation::make()->label(__('admin.actions'))->buttons([ //发布活动 amisMake()->AjaxAction()->label('发布')->icon('fa-regular fa-arrow-alt-circle-up')->level('link') ->actionType('ajax') ->confirmText('是否发布该场活动,一旦发布无法删除。') ->api([ 'method' => 'put', 'url' => admin_url('activities/${id}'), 'data' => [ 'id' => '${id}', 'state' => 1 ] ])->visibleOn('${state == 0}'), $this->rowShowTypeButton('drawer', 'xl'),//活动详情 $this->rowEditTypeButton('drawer', 'lg'), $this->rowDeleteButton()->visibleOn('${state === 0}'), amisMake()->DialogAction()->label('排行榜')->icon('fa-regular fa-chart-bar')->level('link') ->dialog(Dialog::make()->title('排行榜')->body([ amisMake()->CRUDTable()->affixHeader()->columnsTogglable(false) ->perPage(999)->loadDataOnce(true) ->headerToolbar([]) ->title('') ->api(admin_url('user_activities?_action=getData&activity=${id}&perPage=999')) ->columns([ amis()->TableColumn('${index +1}', '排名'), amis()->TableColumn('user.nick_name', __('admin.users.nick_name')), amis()->TableColumn('user.avatar', __('admin.users.avatar'))->type('image')->height('30px')->width('30px'), amis()->TableColumn('join_times', __('admin.user_activities.join_times')), amis()->TableColumn('right_times', __('admin.user_activities.right_times')), amis()->TableColumn('mark', __('admin.user_activities.mark')), amis()->TableColumn('last_join_at', __('admin.user_activities.last_join_at')), ]) ])->size('lg'))->visibleOn('${state != 0}'), //结算活动(参与时间结束后,且最后一场竞猜结束,点击结算则发送奖品) amisMake()->AjaxAction()->label('结算')->icon('fa-regular fa-hand-point-up')->level('link') ->actionType('ajax') ->confirmText('是否结算该场活动,一旦结算则根据当前排名发送奖品。') ->api([ 'method' => 'post', 'url' => admin_url('activities/${id}/finish'), ])->visibleOn('${state == 1}'), ]) ]); return $this->baseList($crud); } public function form($isEdit = false): Form { return $this->baseForm()->body([ amis()->TextControl('name', __('admin.activities.name'))->required(true), Components::make()->cropImageControl('cover', __('admin.activities.cover'), 1.5)->required(true), amis()->DateRangeControl('start_at', __('admin.activities.activity_at'))->extraName('end_at')->clearable(false)->format('YYYY-MM-DD HH:mm:ss')->required(true), amis()->TextControl('share_title', __('admin.activities.share_title')), Components::make()->cropImageControl('share_image', __('admin.activities.share_image'), 1.5), amis()->TextareaControl('rules', __('admin.activities.rules'))->minRows(30), ]); } public function detail() { $form = amisMake()->form()->title('')->panelClassName('border-r border-t-0 border-b-0 border-l-0')->mode('horizontal') ->static(true)->actions([]) ->body([ amis()->FieldSetControl()->title('活动信息')->body([ amis()->TextControl('name', __('admin.activities.name'))->required(true), amis()->Image()->type('static-image')->name('cover')->label( __('admin.activities.cover'))->height('80px')->width('80px')->thumbMode('cover')->enlargeAble(true)->required(true), amis()->DateRangeControl('start_at', __('admin.activities.activity_at'))->extraName('end_at')->clearable(false)->format('YYYY-MM-DD HH:mm:ss')->required(true), amis()->TextControl('share_title', __('admin.activities.share_title')), amis()->Image()->type('static-image')->name('share_image')->label( __('admin.activities.share_image'))->height('80px')->width('80px')->thumbMode('cover')->enlargeAble(true), amis()->TextareaControl('rules', __('admin.activities.rules')) ]), ]); return amisMake()->Grid()->columns([ amis()->Column()->body($form)->md(4), amis()->Column()->body([ amisMake()->form()->title('')->panelClassName('border-0')->mode('horizontal') ->static(true)->actions([]) ->body([ amis()->FieldSetControl()->title('竞猜场次')->body([ amisMake()->CRUDTable()->affixHeader(false)->perPage(10)->loadDataOnce(true) ->headerToolbar([ DialogAction::make()->className('absolute top-3 right-4')->label(__('admin.create'))->icon('fa fa-add')->level('primary')->dialog( Dialog::make()->title('新增竞猜场次')->body([ amisMake()->form()->title('') ->api([ 'method'=>'post', 'url'=>admin_url('activity_games'), "data" => [ 'activity_id'=>'${activity_id}', 'name'=>'${game_name}', 'home_field'=>'${home_field}', 'home_logo'=>'${home_logo}', 'away'=>'${away}', 'away_logo'=>'${away_logo}', 'game_at'=>'${game_at}', 'mark'=>'${mark}', ], ]) ->body([ amis()->TextControl('activity_id', '活动ID')->hidden(true)->value('${id}'), amis()->TextControl('game_name', __('admin.activity_games.name'))->required(true), amis()->GroupControl()->mode('horizontal')->body([ amis()->TextControl('home_field', __('admin.activity_games.home_field'))->required(), Components::make()->cropImageControl('home_logo', __('admin.activity_games.home_logo')), ]), amis()->GroupControl()->mode('horizontal')->body([ amis()->TextControl('away', __('admin.activity_games.away'))->required(), Components::make()->cropImageControl('away_logo', __('admin.activity_games.away_logo')), ]), amis()->DateTimeControl('game_at', __('admin.activity_games.game_at'))->format('YYYY-MM-DD HH:mm:ss')->required(true), Components::make()->sortControl('mark', __('admin.activity_games.mark'))->required(true), ]) ])->size('lg') ) ]) ->title('') ->api(admin_url('activity_games?_action=getData&activity=${id}')) ->columns([ amis()->TableColumn('name', __('admin.activity_games.name')), amis()->TableColumn('state', __('admin.activity_games.state'))->type('mapping')->map([ "0"=>"未发布", "1"=>"进行中", "2"=>"已结束", "*"=> '其他:${state}' ]), amis()->TableColumn('home_field', __('admin.activity_games.home_field')), amis()->TableColumn('home_logo', __('admin.activity_games.home_logo'))->type('image')->height('30px')->width('30px'), amis()->TableColumn('away', __('admin.activity_games.away')), amis()->TableColumn('away_logo', __('admin.activity_games.away_logo'))->type('image')->height('30px')->width('30px'), amis()->TableColumn('game_at', __('admin.activity_games.game_at'))->type('datetime'), amis()->TableColumn('mark', __('admin.activity_games.mark')), amis()->TableColumn('score', __('admin.activity_games.score')), amisMake()->Operation()->label(__('admin.actions'))->buttons([ amisMake()->DialogAction()->label('编辑') ->level('link') ->dialog(Dialog::make()->title('编辑竞猜场次')->body([ amisMake()->form()->title('') ->api('put:'. admin_url('activity_games/${id}')) ->body([ amis()->TextControl('id', '场次ID')->hidden(true)->value('${id}'), amis()->TextControl('name', __('admin.activity_games.name'))->required(true), amis()->GroupControl()->mode('horizontal')->body([ amis()->TextControl('home_field', __('admin.activity_games.home_field'))->required(), Components::make()->cropImageControl('home_logo', __('admin.activity_games.home_logo')), ]), amis()->GroupControl()->mode('horizontal')->body([ amis()->TextControl('away', __('admin.activity_games.away'))->required(), Components::make()->cropImageControl('away_logo', __('admin.activity_games.away_logo')), ]), amis()->DateTimeControl('game_at', __('admin.activity_games.game_at'))->format('YYYY-MM-DD HH:mm:ss')->required(true), Components::make()->sortControl('mark', __('admin.activity_games.mark'))->required(true), ]) ])->size('lg')) ->hiddenOn('${state == 2}'), amisMake()->AjaxAction()->label('发布')->level('link') ->actionType('ajax') ->confirmText('是否发布该场竞猜') ->api([ 'method' => 'put', 'url' => admin_url('activity_games/${id}'), 'data' => [ 'id' => '${id}', 'state' => 1 ] ])->visibleOn('${state == 0}'), amisMake()->AjaxAction()->label('删除')->level('link') ->actionType('ajax') ->confirmText(__('admin.confirm_delete')) ->api([ 'method' => 'delete', 'url' => admin_url('activity_games/${id}') ])->visibleOn('${state == 0}'), amisMake()->DialogAction()->label('结果') ->level('link') ->dialog(Dialog::make()->title('比赛结果')->body([ amisMake()->form()->title('') ->api('post:' .admin_url('activity_games/${id}/finish')) ->body([ amis()->SelectControl('score', __('admin.activity_games.score')) ->options(Score::options())->required(), ]) ]))->visibleOn('${state == 1}'), ]), ]) ]), amis()->FieldSetControl()->title('活动奖品')->className('mt-10')->body([ amisMake()->CRUDTable()->affixHeader(false)->perPage(10)->loadDataOnce(true) ->headerToolbar([ DialogAction::make()->className('absolute top-3 right-4')->label(__('admin.create'))->icon('fa fa-add')->level('primary')->dialog( Dialog::make()->title('新增活动奖品')->body([ amisMake()->form()->title('') ->api([ 'method'=>'post', 'url'=>admin_url('activity_gifts'), "data" => [ 'activity_id'=>'${activity_id}', 'name'=>'${gift_name}', 'logo'=>'${logo}', 'rank'=>'${rank}', 'explain'=>'${explain}', ], ]) ->body([ amis()->TextControl('activity_id', '活动ID')->hidden(true)->value('${id}'), amis()->TextControl('gift_name', __('admin.activity_gifts.name'))->required(true), Components::make()->cropImageControl('logo', __('admin.activity_gifts.logo')), Components::make()->sortControl('rank', __('admin.activity_gifts.rank'))->required(true), amis()->TextareaControl('explain', __('admin.activity_gifts.explain'))->minRows(6) ]) ])->size('lg') ) ]) ->title('') ->api(admin_url('activity_gifts?_action=getData&activity=${id}')) ->columns([ amis()->TableColumn('name', __('admin.activity_gifts.name')), amis()->TableColumn('logo', __('admin.activity_gifts.logo'))->type('image')->height('30px')->width('30px'), amis()->TableColumn('rank', __('admin.activity_gifts.rank')), amisMake()->Operation()->label(__('admin.actions'))->buttons([ amisMake()->DialogAction()->label('编辑') ->level('link') ->dialog(Dialog::make()->title('编辑活动奖品')->body([ amisMake()->form()->title('') ->api('put:'. admin_url('activity_gifts/${id}')) ->body([ amis()->TextControl('id', '奖品ID')->hidden(true)->value('${id}'), amis()->TextControl('name', __('admin.activity_gifts.name'))->required(true), Components::make()->cropImageControl('logo', __('admin.activity_gifts.logo')), Components::make()->sortControl('rank', __('admin.activity_gifts.rank'))->required(true), amis()->TextareaControl('explain', __('admin.activity_gifts.explain'))->minRows(6) ]) ])->size('lg')), amisMake()->AjaxAction()->label('删除')->level('link') ->actionType('ajax') ->confirmText(__('admin.confirm_delete')) ->api([ 'method' => 'delete', 'url' => admin_url('activity_gifts/${id}') ]), ]), ]) ]), ]) ])->md(8), ]); } public function detailActions() { return [ //返回 amis()->Button()->actionType('cancel')->label(__('admin.back'))->primary() ]; } /** * 结算活动,并发送奖品 */ public function finish(Activity $activity) { //若存在未公布结果的比赛场次,无法结算; if($activity->games()->where('state', '<>', 2)->exists()){ return $this->response()->fail('该活动存在未公布结果的竞猜场次,请先公布结果'); } $res = $this->service->finishActivity($activity); return $this->autoResponse($res, '结算'); } }