6
0
Fork 0
jiqu-library-server/app/Admin/Controllers/Draw/DrawActivityPrizeController...

214 lines
8.0 KiB
PHP

<?php
namespace App\Admin\Controllers\Draw;
use App\Admin\Repositories\DrawActivityPrize as DrawActivityPrizeRepository;
use App\Enums\DrawPrizeType;
use App\Exceptions\BizException;
use App\Http\Controllers\Controller;
use App\Models\DrawActivity;
use App\Models\DrawPrize;
use Dcat\Admin\Admin;
use Dcat\Admin\Form;
use Dcat\Admin\Layout\Content;
use Illuminate\Validation\Rule;
class DrawActivityPrizeController extends Controller
{
protected function title()
{
if (property_exists($this, 'title')) {
return $this->title;
}
return admin_trans_label();
}
protected function description()
{
if (property_exists($this, 'description')) {
return $this->description;
}
}
protected function translation()
{
if (property_exists($this, 'translation')) {
return $this->translation;
}
}
public function create($drawActivityId, Content $content)
{
$drawActivity = DrawActivity::findOrFail($drawActivityId);
return $content
->translation($this->translation())
->title($this->title())
->description($this->description()['create'] ?? trans('admin.create'))
->body($this->form($drawActivity));
}
public function store($drawActivityId)
{
$drawActivity = DrawActivity::findOrFail($drawActivityId);
if ($drawActivity->isPublished()) {
throw new BizException('活动已发布');
}
return $this->form($drawActivity)->store();
}
public function edit($drawActivityId, $drawActivityPrizeId, Content $content)
{
$drawActivity = DrawActivity::findOrFail($drawActivityId);
return $content
->translation($this->translation())
->title($this->title())
->description($this->description()['edit'] ?? trans('admin.edit'))
->body($this->form($drawActivity)->edit($drawActivityPrizeId));
}
public function update($drawActivityId, $drawActivityPrizeId)
{
$drawActivity = DrawActivity::findOrFail($drawActivityId);
if ($drawActivity->isClosed()) {
throw new BizException('活动已结束');
}
$drawActivityPrize = $drawActivity->prizes()->findOrFail($drawActivityPrizeId);
return $this->form($drawActivity)->update($drawActivityPrize->id);
}
public function destroy($drawActivityId, $drawActivityPrizeId)
{
$drawActivity = DrawActivity::findOrFail($drawActivityId);
if ($drawActivity->isPublished()) {
throw new BizException('活动已发布');
}
$drawActivity->prizes()->where('id', $drawActivityPrizeId)->delete();
return Admin::json()
->alert()
->status(true)
->message(trans('admin.delete_succeeded'))
->refresh();
}
protected function form(DrawActivity $drawActivity)
{
return Form::make(new DrawActivityPrizeRepository(), function (Form $form) use ($drawActivity) {
if ($form->isCreating()) {
$form->hidden('draw_activity_id')->default($drawActivity->id);
}
if ($form->isCreating() || ! $drawActivity->isPublished()) {
$form->radio('draw_prize_source', '来源')
->options([
1 => '自定义',
2 => '奖品库',
])
->when(1, function (Form $form) {
$form->text('name', '名称')
->rules(['bail', 'required_if:draw_prize_source,1', 'nullable', 'string', 'max:255'], ['required_if' => '不能为空'])
->setLabelClass(['asterisk']);
$form->image('icon', '图标')
->move('draw/prizes')
->uniqueName()
->saveFullUrl()
->removable(false)
->autoUpload()
->retainable()
->rules(['bail', 'required_if:draw_prize_source,1'], ['required_if' => '不能为空'])
->setLabelClass(['asterisk']);
$form->select('type', '类型')
->options(DrawPrizeType::options())
->rules(['bail', 'required_if:draw_prize_source,1', 'nullable', Rule::in(array_keys(DrawPrizeType::options()))], ['required_if' => '不能为空'])
->setLabelClass(['asterisk']);
$form->text('amount', '面值/数量')
->rules(['bail', 'required_if:draw_prize_source,1', 'nullable', 'min:0', 'regex:/^([1-9]\d*|0)(\.\d{1,2})?$/'], ['required_if' => '不能为空'])
->setLabelClass(['asterisk'])
->help('精确到2位小数');
})
->when(2, function (Form $form) {
$form->select('draw_prize_id', '奖品')
->options(DrawPrize::pluck('name', 'id'))
->rules(['bail', 'required_if:draw_prize_source,2'], ['required_if' => '不能为空'])
->setLabelClass(['asterisk']);
})
->setLabelClass(['asterisk'])
->value($form->isEditing() ? 1 : 2)
->default(1);
$form->radio('limited', '是否限量')
->options([
0 => '否',
1 => '是',
])
->when(1, function (Form $form) {
$form->number('stock', '库存')
->min(0)
->rules(['required_if:limited,1', 'int', 'min:0'], ['required_if' => '不能为空'])
->setLabelClass(['asterisk']);
})
->default(1)
->customFormat(function ($v) {
return $v ? 1 : 0;
})
->setLabelClass(['asterisk']);
} else {
$form->display('name', '名称')
->setLabelClass(['asterisk']);
$form->image('icon', '图标')
->disable()
->setLabelClass(['asterisk']);
$form->display('type', '类型')
->setLabelClass(['asterisk'])
->with(fn () => $this->type->label());
$form
->display('amount', '面值/数量')
->setLabelClass(['asterisk'])
->with(fn ($value) => trim_trailing_zeros($value));
}
$form->number('weight', '权重')
->rules(['bail', 'required', 'int', 'min:0'])
->min(0)
->setLabelClass(['asterisk'])
->attribute('required', true);
$form->number('sort', '排序')->default(0)->rules(['required', 'int']);
$form->saving(function (Form $form) use ($drawActivity) {
if (! $form->isCreating()) {
$form->deleteInput('draw_activity_id');
}
if ($form->isCreating() || ! $drawActivity->isPublished()) {
if ($form->input('draw_prize_source') != 1) {
$drawPrize = DrawPrize::findOrFail($form->input('draw_prize_id'));
$form->input('name', $drawPrize->name);
$form->input('icon', $drawPrize->icon);
$form->input('type', $drawPrize->type);
$form->input('amount', $drawPrize->amount);
}
$form->deleteInput(['draw_prize_source', 'draw_prize_id']);
} else {
$form->deleteInput(['name', 'icon', 'type', 'amount', 'limited', 'stock']);
}
});
});
}
}