6
0
Fork 0
jiqu-library-server/app/Admin/Controllers/DrawActivityController.php

215 lines
8.3 KiB
PHP

<?php
namespace App\Admin\Controllers;
use App\Admin\Actions\Grid\DrawActivityClose;
use App\Admin\Actions\Grid\DrawActivityPublish;
use App\Admin\Actions\Show\DrawActivityPublish as DrawActivityPublishShowAction;
use App\Admin\Renderable\DrawActivityPrizeTable;
use App\Admin\Renderable\DrawActivityTicketTable;
use App\Admin\Renderable\DrawLogTable;
use App\Admin\Repositories\DrawActivity as DrawActivityRepository;
use App\Enums\DrawActivityStatus;
use App\Exceptions\BizException;
use App\Models\DrawActivity;
use Dcat\Admin\Admin;
use Dcat\Admin\Form;
use Dcat\Admin\Grid;
use Dcat\Admin\Http\Controllers\AdminController;
use Dcat\Admin\Layout\Row;
use Dcat\Admin\Show;
use Dcat\Admin\Widgets\Tab;
class DrawActivityController extends AdminController
{
public function update($id)
{
$drawActivity = DrawActivity::findOrFail($id);
if ($drawActivity->isClosed()) {
throw new BizException('活动已结束');
}
return parent::update($id);
}
public function destroy($id)
{
$drawActivity = DrawActivity::findOrFail($id);
if ($drawActivity->isPublished()) {
throw new BizException('活动已发布');
}
return Admin::json()
->alert()
->status(true)
->message(trans('admin.delete_succeeded'));
}
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
return Grid::make(new DrawActivityRepository(), function (Grid $grid) {
// 设置弹窗的宽和高
$grid->setDialogFormDimensions('70%', '90%');
$grid->model()->orderBy('id', 'desc');
$grid->column('id')->sortable();
$grid->column('name');
$grid->column('start_at')->display(function ($v) {
return $v?->toDateTimeString() ?: '-';
});
$grid->column('end_at')->display(function ($v) {
return $v?->toDateTimeString() ?: '-';
});
$grid->column('published_at')->display(function ($v) {
return $v?->toDateTimeString() ?: '-';
})->sortable();
$grid->column('real_status')->display(function ($status) {
return $status->label();
});
$grid->column('bg_image')->image(null, 80, 80);
$grid->column('bg_color')->display(function () {
return $this->getBgColorLabel();
});
if (Admin::user()->can('dcat.admin.draw_activities.create')) {
$grid->enableDialogCreate();
$grid->showCreateButton();
}
$grid->actions(function (Grid\Displayers\Actions $actions) {
if (! $actions->row->isClosed() && Admin::user()->can('dcat.admin.draw_activities.edit')) {
$actions->quickEdit(true);
}
if (Admin::user()->can('dcat.admin.draw_activities.show')) {
$actions->append('<a style="cursor: pointer;" target="_blank" href="'.admin_route('draw_activities.show', ['draw_activity' => $actions->row]).'"><i class="feather icon-eye"></i> 显示</a>');
}
if (! $actions->row->isClosed() && $actions->row->isPublished() && Admin::user()->can('dcat.admin.draw_activities.close')) {
$actions->append(new DrawActivityClose());
}
if (! $actions->row->isPublished() && Admin::user()->can('dcat.admin.draw_activities.publish')) {
$actions->append(new DrawActivityPublish());
}
if ($actions->row->isPublished() && Admin::user()->can('dcat.admin.draw_activities.ticket_list')) {
$actions->append('<a style="cursor: pointer;" target="_blank" href="'.admin_route('draw_activities.ticket_list', ['draw_activity' => $actions->row]).'"><i class="feather icon-eye"></i> 抽奖次数</a>');
}
if ($actions->row->isPublished() && Admin::user()->can('dcat.admin.draw_activities.log_list')) {
$actions->append('<a style="cursor: pointer;" target="_blank" href="'.admin_route('draw_activities.log_list', ['draw_activity' => $actions->row]).'"><i class="feather icon-eye"></i> 中奖记录</a>');
}
if (! $actions->row->isPublished() && Admin::user()->can('dcat.admin.draw_activities.destroy')) {
$actions->disableDelete(false);
}
});
$grid->filter(function (Grid\Filter $filter) {
$filter->panel(false);
$filter->like('name')->width(3);
$filter->where('status', function ($builder) {
return match (DrawActivityStatus::tryFrom($this->input)) {
DrawActivityStatus::Created => $builder->onlyCreated(),
DrawActivityStatus::Publishing => $builder->onlyPublishing(),
DrawActivityStatus::Unstart => $builder->onlyUnstart(),
DrawActivityStatus::Running => $builder->onlyRunning(),
DrawActivityStatus::Closed =>$builder->onlyClosed(),
default => $builder,
};
})->select(DrawActivityStatus::options())->width(3);
});
});
}
protected function detail($id)
{
$drawActivity = DrawActivity::findOrFail($id);
$row = new Row();
$row->column(5, Show::make($id, $drawActivity, function (Show $show) {
$show->field('name');
$show->field('desc')->unescape();
$show->field('start_at');
$show->field('end_at');
$show->field('real_status')->unescape()->as(function () {
return $this->real_status->label();
});
$show->field('published_at');
$show->field('bg_image')->image();
$show->field('bg_color')->unescape()->as(function () {
return $this->getBgColorLabel();
});
$show->panel()
->tools(function (Show\Tools $tools) use ($show) {
$tools->disableEdit();
$tools->disableDelete();
if (! $show->model()->isPublished() && Admin::user()->can('dcat.admin.draw_activities.publish')) {
$tools->append(new DrawActivityPublishShowAction());
}
});
}));
$row->column(7, tap(new Tab(), function (Tab $tab) use ($drawActivity) {
if (request()->routeIs('dcat.admin.draw_activities.ticket_list')) {
$tab->add('抽奖次数', new DrawActivityTicketTable(['draw_activity_id' => $drawActivity->id]), true);
} elseif (request()->routeIs('dcat.admin.draw_activities.log_list')) {
$tab->add('中奖记录', new DrawLogTable(['draw_activity_id' => $drawActivity->id]), true);
} else {
$tab->add('活动奖品', new DrawActivityPrizeTable(['draw_activity_id' => $drawActivity->id]), true);
}
$tab->withCard();
}));
return $row;
}
protected function form()
{
return Form::make(new DrawActivityRepository(), function (Form $form) {
$form->text('name')
->rules(['bail', 'required', 'string', 'max:255'])
->setLabelClass(['asterisk'])
->attribute('required', true);
$form->editor('desc')
->height('600');
if ($form->isEditing() && $form->model()->isPublished()) {
$form->display('start_at');
$form->display('end_at');
} else {
$form->datetime('start_at');
$form->datetime('end_at');
}
$form->image('bg_image')
->move('draw/activities')
->uniqueName()
->saveFullUrl()
->removable(false)
->autoUpload()
->retainable();
$form->text('bg_color')->help('十六进制颜色码');
$form->submitted(function (Form $form) {
if ($form->isEditing() && $form->model()->isPublished()) {
$form->deleteInput(['start_at', 'end_at']);
}
});
});
}
}