generated from liutk/owl-admin-base
330 lines
22 KiB
PHP
330 lines
22 KiB
PHP
<?php
|
|
|
|
namespace App\Admin\Controllers;
|
|
|
|
use Slowlyo\OwlAdmin\Admin;
|
|
use Slowlyo\OwlAdmin\Renderers\Page;
|
|
use Slowlyo\OwlAdmin\Renderers\Form;
|
|
use Slowlyo\OwlAdmin\Renderers\Operation;
|
|
use Slowlyo\OwlAdmin\Renderers\Dialog;
|
|
use Slowlyo\OwlAdmin\Renderers\DialogAction;
|
|
use Slowlyo\OwlAdmin\Controllers\AdminController;
|
|
use App\Services\Admin\ActivityService;
|
|
use App\Traits\CustomActionTrait;
|
|
use App\Admin\Components;
|
|
use App\Enums\Score;
|
|
use App\Models\Activity;
|
|
use Illuminate\Http\Request;
|
|
|
|
class ActivityController extends AdminController
|
|
{
|
|
use CustomActionTrait;
|
|
protected string $serviceName = ActivityService::class;
|
|
|
|
public function list(): Page
|
|
{
|
|
$crud = $this->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')),
|
|
amis()->SelectControl('state', __('admin.activities.state'))->columnRatio(3)
|
|
->clearAble()
|
|
->options([
|
|
1=>'进行中',2=>'已结束',0=>'未发布'
|
|
]),
|
|
]),
|
|
]))->filterDefaultVisible(true)
|
|
->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"=>"<span class='label label-default'>未发布</span>",
|
|
"1"=>"<span class='label label-danger'>进行中</span>",
|
|
"2"=>"<span class='label label-success'>已结束</span>",
|
|
"*"=> '其他:${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')->closeOnOutside())->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'))->trimContents(false)->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'))->format('YYYY-MM-DD HH:mm:ss'),
|
|
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()->imageControl('home_logo', __('admin.activity_games.home_logo')),
|
|
]),
|
|
amis()->GroupControl()->mode('horizontal')->body([
|
|
amis()->TextControl('away', __('admin.activity_games.away'))->required(),
|
|
Components::make()->imageControl('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"=>"<span class='label label-default'>未发布</span>",
|
|
"1"=>"<span class='label label-info'>进行中</span>",
|
|
"2"=>"<span class='label label-success'>已结束</span>",
|
|
"*"=> '其他:${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'))->trimContents(false)->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'))->trimContents(false)->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, '结算');
|
|
}
|
|
} |