generated from liutk/owl-admin-base
完善足球竞猜活动后台管理
parent
223431204a
commit
86469f0f83
|
|
@ -13,6 +13,8 @@ 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
|
||||
{
|
||||
|
|
@ -38,17 +40,42 @@ class ActivityController extends AdminController
|
|||
->columns([
|
||||
amis()->TableColumn('id', __('admin.id'))->width('50px')->sortable(),
|
||||
amis()->TableColumn('name', __('admin.activities.name')),
|
||||
amis()->TableColumn('state', __('admin.activities.state')),
|
||||
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>",
|
||||
"*"=> '其他:${gender}'
|
||||
]),
|
||||
amis()->TableColumn('user_count', __('admin.activities.user_count')),
|
||||
amis()->TableColumn('start_at', __('admin.activities.start_at')),
|
||||
amis()->TableColumn('end_at', __('admin.activities.end_at')),
|
||||
|
||||
amis()->TableColumn('created_at', __('admin.created_at'))->type('datetime')->sortable(true),
|
||||
Operation::make()->label(__('admin.actions'))->buttons([
|
||||
//发布活动-todo
|
||||
//结算活动(参与时间结束后,且最后一场竞猜结束,点击结算则发送奖品)-todo
|
||||
$this->rowShowTypeButton('drawer', 'xl'),//活动详情-todo-//竞猜赛程//活动奖品
|
||||
//发布活动
|
||||
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()->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}'),
|
||||
])
|
||||
]);
|
||||
|
||||
|
|
@ -87,7 +114,7 @@ class ActivityController extends AdminController
|
|||
amis()->FieldSetControl()->title('竞猜场次')->body([
|
||||
amisMake()->CRUDTable()->affixHeader(false)->perPage(10)->loadDataOnce(true)
|
||||
->headerToolbar([
|
||||
DialogAction::make()->className('absolute top-3 right-4')->label(__('admin.create'))->dialog(
|
||||
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([
|
||||
|
|
@ -109,11 +136,11 @@ class ActivityController extends AdminController
|
|||
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'))->required(true),
|
||||
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'))->required(true),
|
||||
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),
|
||||
|
|
@ -122,9 +149,15 @@ class ActivityController extends AdminController
|
|||
)
|
||||
])
|
||||
->title('')
|
||||
->api(admin_url('activity_games?_action=getData&state=1&activity_id=${id}'))
|
||||
->api(admin_url('activity_games?_action=getData&activity_id=${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>",
|
||||
"*"=> '其他:${gender}'
|
||||
]),
|
||||
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')),
|
||||
|
|
@ -133,32 +166,112 @@ class ActivityController extends AdminController
|
|||
amis()->TableColumn('mark', __('admin.activity_games.mark')),
|
||||
amis()->TableColumn('score', __('admin.activity_games.score')),
|
||||
amisMake()->Operation()->label(__('admin.actions'))->buttons([
|
||||
// amisMake()->AjaxAction()->label('发布')->level('link')
|
||||
// ->actionType('ajax')
|
||||
// ->confirmText(__('admin.confirm_delete'))
|
||||
// ->api([
|
||||
// 'method' => 'delete',
|
||||
// 'url' => admin_url('activity_games/${id}')
|
||||
// ])
|
||||
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'),
|
||||
])->visibleOn('${state == 0}'),
|
||||
amisMake()->DialogAction()->label('结果')
|
||||
->level('link')
|
||||
->dialog(Dialog::make()->title('比赛结果')->body([
|
||||
amisMake()->form()->title('')
|
||||
->api('put:'.admin_url('/activity_games/${id}'))
|
||||
->api('post:' .admin_url('activity_games/${id}/finish'))
|
||||
->body([
|
||||
amis()->TextControl('id', '场次ID')->hidden(true)->value('${id}'),
|
||||
amis()->TextControl('state', '状态')->hidden(true)->value(2),
|
||||
amis()->SelectControl('score', __('admin.activity_games.score'))
|
||||
->options(Score::options()),
|
||||
->options(Score::options())->required(),
|
||||
])
|
||||
]))->visibleOn('${state} == 1'),
|
||||
]))->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'))
|
||||
])
|
||||
])->size('lg')
|
||||
)
|
||||
])
|
||||
->title('')
|
||||
->api(admin_url('activity_gifts?_action=getData&activity_id=${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'))
|
||||
])
|
||||
])->size('lg')),
|
||||
amisMake()->AjaxAction()->label('删除')->level('link')
|
||||
->actionType('ajax')
|
||||
->confirmText(__('admin.confirm_delete'))
|
||||
->api([
|
||||
'method' => 'delete',
|
||||
'url' => admin_url('activity_gifts/${id}')
|
||||
]),
|
||||
]),
|
||||
])
|
||||
]),
|
||||
|
|
@ -174,4 +287,17 @@ class ActivityController extends AdminController
|
|||
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, '结算');
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,73 @@
|
|||
<?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\Controllers\AdminController;
|
||||
use App\Services\Admin\ActivityGameService;
|
||||
use App\Models\ActivityGame;
|
||||
use App\Admin\Components;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class ActivityGameController extends AdminController
|
||||
{
|
||||
protected string $serviceName = ActivityGameService::class;
|
||||
|
||||
public function list(): Page
|
||||
{
|
||||
$crud = $this->baseCRUD()->tableLayout('fixed')
|
||||
->headerToolbar([
|
||||
|
||||
])
|
||||
->filter($this->baseFilter()->labelWidth('80px')->body([
|
||||
]))
|
||||
->columns([
|
||||
|
||||
]);
|
||||
|
||||
return $this->baseList($crud);
|
||||
}
|
||||
|
||||
public function form($isEdit = false): Form
|
||||
{
|
||||
return $this->baseForm()->body([
|
||||
|
||||
]);
|
||||
}
|
||||
|
||||
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([
|
||||
|
||||
]);
|
||||
|
||||
return amisMake()->Grid()->columns([
|
||||
amis()->Column()->body($form)->md(4),
|
||||
amis()->Column()->body([
|
||||
])->md(8),
|
||||
]);
|
||||
}
|
||||
|
||||
public function detailActions()
|
||||
{
|
||||
return [
|
||||
//返回
|
||||
amis()->Button()->actionType('cancel')->label(__('admin.back'))->primary()
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* 公布结果,并添加成绩
|
||||
*/
|
||||
public function finish(ActivityGame $activityGame, Request $request)
|
||||
{
|
||||
$res = $this->service->finishGame($activityGame, $request->input('score'));
|
||||
|
||||
return $this->autoResponse($res, '操作');
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,61 @@
|
|||
<?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\Controllers\AdminController;
|
||||
use App\Services\Admin\ActivityGiftService;
|
||||
use App\Admin\Components;
|
||||
|
||||
class ActivityGiftController extends AdminController
|
||||
{
|
||||
protected string $serviceName = ActivityGiftService::class;
|
||||
|
||||
public function list(): Page
|
||||
{
|
||||
$crud = $this->baseCRUD()->tableLayout('fixed')
|
||||
->headerToolbar([
|
||||
|
||||
])
|
||||
->filter($this->baseFilter()->labelWidth('80px')->body([
|
||||
]))
|
||||
->columns([
|
||||
|
||||
]);
|
||||
|
||||
return $this->baseList($crud);
|
||||
}
|
||||
|
||||
public function form($isEdit = false): Form
|
||||
{
|
||||
return $this->baseForm()->body([
|
||||
|
||||
]);
|
||||
}
|
||||
|
||||
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([
|
||||
|
||||
]);
|
||||
|
||||
return amisMake()->Grid()->columns([
|
||||
amis()->Column()->body($form)->md(4),
|
||||
amis()->Column()->body([
|
||||
])->md(8),
|
||||
]);
|
||||
}
|
||||
|
||||
public function detailActions()
|
||||
{
|
||||
return [
|
||||
//返回
|
||||
amis()->Button()->actionType('cancel')->label(__('admin.back'))->primary()
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
@ -34,10 +34,14 @@ Route::group([
|
|||
|
||||
$router->resource('users', \App\Admin\Controllers\UserController::class)->only(['index', 'show']);
|
||||
|
||||
$router->post('activities/{activity}/finish', [\App\Admin\Controllers\ActivityController::class, 'finish']);
|
||||
$router->resource('activities', \App\Admin\Controllers\ActivityController::class);
|
||||
|
||||
$router->post('activity_games/{activity_game}/finish', [\App\Admin\Controllers\ActivityGameController::class, 'finish']);
|
||||
$router->resource('activity_games', \App\Admin\Controllers\ActivityGameController::class);
|
||||
|
||||
$router->resource('activity_gifts', \App\Admin\Controllers\ActivityGiftController::class);
|
||||
|
||||
//修改上传
|
||||
$router->post('upload_file', [\App\Admin\Controllers\IndexController::class, 'uploadFile']);
|
||||
$router->post('upload_image', [\App\Admin\Controllers\IndexController::class, 'uploadImage']);
|
||||
|
|
|
|||
|
|
@ -16,4 +16,14 @@ class Activity extends Model
|
|||
->orderBy('end_at', 'desc')
|
||||
->orderBy('created_at', 'desc');
|
||||
}
|
||||
|
||||
public function gifts()
|
||||
{
|
||||
return $this->hasMany(ActivityGift::class, 'activity_id');
|
||||
}
|
||||
|
||||
public function logs()
|
||||
{
|
||||
return $this->hasMany(UserActivity::class, 'activity_id');
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,8 +10,22 @@ class ActivityGame extends Model
|
|||
{
|
||||
use HasFactory,Filterable;
|
||||
|
||||
protected $fillable = [
|
||||
'state', 'score',
|
||||
];
|
||||
|
||||
public function scopeSort($q)
|
||||
{
|
||||
|
||||
$q->orderBy('game_at', 'desc');
|
||||
}
|
||||
|
||||
public function logs()
|
||||
{
|
||||
return $this->hasMany(UserGame::class, 'game_id');
|
||||
}
|
||||
|
||||
public function activity()
|
||||
{
|
||||
return $this->belongsTo(Activity::class, 'activity_id');
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,8 +4,14 @@ namespace App\Models;
|
|||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use EloquentFilter\Filterable;
|
||||
|
||||
class ActivityGift extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
use HasFactory,Filterable;
|
||||
|
||||
public function scopeSort($q)
|
||||
{
|
||||
$q->orderBy('rank', 'asc');
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,17 @@
|
|||
<?php
|
||||
|
||||
namespace App\Models\Filters;
|
||||
|
||||
use Illuminate\Support\Arr;
|
||||
use EloquentFilter\ModelFilter;
|
||||
|
||||
class ActivityGameFilter extends ModelFilter
|
||||
{
|
||||
/**
|
||||
* 主键
|
||||
*/
|
||||
public function id($id)
|
||||
{
|
||||
return $this->where('id', $id);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
<?php
|
||||
|
||||
namespace App\Models\Filters;
|
||||
|
||||
use Illuminate\Support\Arr;
|
||||
use EloquentFilter\ModelFilter;
|
||||
|
||||
class ActivityGiftFilter extends ModelFilter
|
||||
{
|
||||
/**
|
||||
* 主键
|
||||
*/
|
||||
public function id($id)
|
||||
{
|
||||
return $this->where('id', $id);
|
||||
}
|
||||
}
|
||||
|
|
@ -8,4 +8,15 @@ use Illuminate\Database\Eloquent\Model;
|
|||
class UserActivity extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
|
||||
protected $fillable = [
|
||||
'mark','has_gift'
|
||||
];
|
||||
|
||||
public function scopeSort($q)
|
||||
{
|
||||
$q->orderBy('mark', 'desc')
|
||||
->orderBy('right_time', 'desc')
|
||||
->orderBy('last_join_at', 'asc');
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,4 +8,8 @@ use Illuminate\Database\Eloquent\Model;
|
|||
class UserGame extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
|
||||
protected $fillable = [
|
||||
'is_right'
|
||||
];
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,106 @@
|
|||
<?php
|
||||
|
||||
namespace App\Services\Admin;
|
||||
|
||||
use App\Models\ActivityGame;
|
||||
use App\Models\Filters\ActivityGameFilter;
|
||||
use App\Traits\UploadTrait;
|
||||
use Illuminate\Support\Arr;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use DB;
|
||||
|
||||
/**
|
||||
* @method ActivityGame getModel()
|
||||
* @method ActivityGame|\Illuminate\Database\Query\Builder query()
|
||||
*/
|
||||
class ActivityGameService extends BaseService
|
||||
{
|
||||
use UploadTrait;
|
||||
|
||||
protected string $modelName = ActivityGame::class;
|
||||
|
||||
protected string $modelFilterName = ActivityGameFilter::class;
|
||||
|
||||
protected bool $modelSortAble = true;
|
||||
|
||||
public function store($data): bool
|
||||
{
|
||||
$columns = $this->getTableColumns();
|
||||
$model = $this->getModel();
|
||||
|
||||
$data['home_logo'] = $this->saveImage('home_logo', 'activity_games/home_logo')[0] ?? Storage::disk('public')->url('images/default-gamelogo.png');
|
||||
$data['away_logo'] = $this->saveImage('away_logo', 'activity_games/away_logo')[0] ?? Storage::disk('public')->url('images/default-gamelogo.png');
|
||||
|
||||
foreach ($data as $k => $v) {
|
||||
if (!in_array($k, $columns)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$model->setAttribute($k, $v);
|
||||
}
|
||||
|
||||
return $model->save();
|
||||
}
|
||||
|
||||
public function update($primaryKey, $data): bool
|
||||
{
|
||||
$columns = $this->getTableColumns();
|
||||
$model = $this->query()->whereKey($primaryKey)->first();
|
||||
|
||||
if(array_key_exists('home_logo', $data)){
|
||||
$data['home_logo'] = $this->saveImage('home_logo', 'activity_games/home_logo')[0] ?? Storage::disk('public')->url('images/default-gamelogo.png');
|
||||
}
|
||||
if(array_key_exists('away_logo', $data)){
|
||||
$data['away_logo'] = $this->saveImage('away_logo', 'activity_games/away_logo')[0] ?? Storage::disk('public')->url('images/default-gamelogo.png');
|
||||
}
|
||||
|
||||
foreach ($data as $k => $v) {
|
||||
if (!in_array($k, $columns)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$model->setAttribute($k, $v);
|
||||
}
|
||||
|
||||
return $model->save();
|
||||
}
|
||||
|
||||
|
||||
public function delete(string $ids): mixed
|
||||
{
|
||||
$ids = explode(',', $ids);
|
||||
//判断活动未发布,才可删除
|
||||
if($this->query()->whereIn('id', $ids)->where('state', '<>', 0)->exists()){
|
||||
$this->setError('已发布竞猜不能删除');
|
||||
}
|
||||
return $this->query()->whereIn('id', $ids)->delete();
|
||||
}
|
||||
|
||||
public function finishGame(ActivityGame $activityGame, $score)
|
||||
{
|
||||
try{
|
||||
DB::beginTransaction();
|
||||
//更新状态,结果
|
||||
$activityGame->update([
|
||||
'state' => 2,
|
||||
'score' => $score
|
||||
]);
|
||||
$activityGame->logs()->where('score', $score)->update(['is_right'=>1]);
|
||||
$activityGame->activity->logs()->whereIn('user_id',
|
||||
$activityGame->logs()->where('score', $score)->get()->pluck('user_id')->toArray()
|
||||
)
|
||||
->incrementEach([
|
||||
'mark'=> $activityGame->mark,
|
||||
'right_time'=> 1
|
||||
]);
|
||||
|
||||
DB::commit();
|
||||
}catch(Throwable $th){
|
||||
DB::rollBack();
|
||||
report($th);
|
||||
return $this->setError('系统错误,请刷新后重试');
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,61 @@
|
|||
<?php
|
||||
|
||||
namespace App\Services\Admin;
|
||||
|
||||
use App\Models\ActivityGift;
|
||||
use App\Models\Filters\ActivityGiftFilter;
|
||||
use App\Traits\UploadTrait;
|
||||
use Illuminate\Support\Arr;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
|
||||
/**
|
||||
* @method ActivityGift getModel()
|
||||
* @method ActivityGift|\Illuminate\Database\Query\Builder query()
|
||||
*/
|
||||
class ActivityGiftService extends BaseService
|
||||
{
|
||||
use UploadTrait;
|
||||
|
||||
protected string $modelName = ActivityGift::class;
|
||||
|
||||
protected string $modelFilterName = ActivityGiftFilter::class;
|
||||
|
||||
public function store($data): bool
|
||||
{
|
||||
$columns = $this->getTableColumns();
|
||||
$model = $this->getModel();
|
||||
|
||||
$data['logo'] = $this->saveImage('logo', 'activity_gifts/logo')[0] ?? Storage::disk('public')->url('images/default-gamelogo.png');
|
||||
|
||||
foreach ($data as $k => $v) {
|
||||
if (!in_array($k, $columns)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$model->setAttribute($k, $v);
|
||||
}
|
||||
|
||||
return $model->save();
|
||||
}
|
||||
|
||||
public function update($primaryKey, $data): bool
|
||||
{
|
||||
$columns = $this->getTableColumns();
|
||||
$model = $this->query()->whereKey($primaryKey)->first();
|
||||
|
||||
if(array_key_exists('logo', $data)){
|
||||
$data['logo'] = $this->saveImage('logo', 'activity_gifts/logo')[0] ?? Storage::disk('public')->url('images/default-gamelogo.png');
|
||||
}
|
||||
|
||||
foreach ($data as $k => $v) {
|
||||
if (!in_array($k, $columns)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$model->setAttribute($k, $v);
|
||||
}
|
||||
|
||||
return $model->save();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -69,4 +69,45 @@ class ActivityService extends BaseService
|
|||
}
|
||||
return $this->query()->whereIn('id', $ids)->delete();
|
||||
}
|
||||
|
||||
public function finishActivity(Activity $activity)
|
||||
{
|
||||
try{
|
||||
DB::beginTransaction();
|
||||
//更新活动状态;
|
||||
$activity->update(['state' => 2]);
|
||||
//获取活动奖品;
|
||||
$activityGifts = $activity->gifts()->sort()->get();
|
||||
//获取当前排名;
|
||||
$activityRanklist = $activity->logs()->sort()->get();
|
||||
//组装获奖名单,并批量插入;
|
||||
$userGifts = $userIds = [];
|
||||
foreach($activityGifts as $gift){
|
||||
$_userGift = [
|
||||
'user_id' => $activityRanklist->get($gift->rank -1)?->user_id ?? 0,
|
||||
'activity_id' => $activity->id,
|
||||
'gift_id' => $gift->id,
|
||||
];
|
||||
if($_userGift['user_id']){
|
||||
$userGifts[] = $_userGift;
|
||||
$userIds[] = $_userGift['user_id'];
|
||||
}
|
||||
}
|
||||
if(count($userGifts) > 0){
|
||||
DB::table('user_gifts')->insert($userGifts);
|
||||
}
|
||||
//更新活动记录;
|
||||
$activity->logs()->whereIn('user_id', $userIds)->update([
|
||||
'has_gift' => 1
|
||||
]);
|
||||
|
||||
DB::commit();
|
||||
}catch(Throwable $th){
|
||||
DB::rollBack();
|
||||
report($th);
|
||||
return $this->setError('系统错误,请刷新后重试');
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
@ -21,6 +21,8 @@ return new class extends Migration
|
|||
$table->timestamp('last_join_at')->comment('最后一次竞猜时间');
|
||||
$table->unsignedTinyInteger('has_gift')->default(0)->comment('是否获奖');
|
||||
$table->timestamps();
|
||||
|
||||
$table->unique(['user_id', 'activity_id']);
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -20,6 +20,8 @@ return new class extends Migration
|
|||
$table->enum('score', Score::options())->nullable()->comment('竞猜结果');
|
||||
$table->unsignedTinyInteger('is_right')->default(0)->comment('是否答对');
|
||||
$table->timestamps();
|
||||
|
||||
$table->unique(['user_id', 'game_id']);
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -321,7 +321,8 @@ return [
|
|||
'start_at' => '开始时间',
|
||||
'end_at' => '结束时间',
|
||||
'rules' => '规则内容',
|
||||
'cover' => '活动封面'
|
||||
'cover' => '活动封面',
|
||||
'user_count' => '参与人数'
|
||||
],
|
||||
'activity_games' => [
|
||||
'name' => '场次名称',
|
||||
|
|
@ -330,7 +331,13 @@ return [
|
|||
'away' => '客场',
|
||||
'away_logo' => '客场logo',
|
||||
'game_at' => '比赛时间',
|
||||
'mark' => '分数',
|
||||
'score' => '比赛结果'
|
||||
]
|
||||
'mark' => '奖励',
|
||||
'score' => '比分'
|
||||
],
|
||||
'activity_gifts' => [
|
||||
'name' => '奖品名称',
|
||||
'logo' => '奖品图片',
|
||||
'rank' => '奖励名次',
|
||||
'explain' => '领奖说明',
|
||||
],
|
||||
];
|
||||
|
|
|
|||
|
|
@ -1,2 +1,4 @@
|
|||
*
|
||||
!images/
|
||||
!images/default-gamelogo.png
|
||||
!.gitignore
|
||||
|
|
|
|||
Binary file not shown.
|
After Width: | Height: | Size: 3.9 KiB |
Loading…
Reference in New Issue