214 lines
8.0 KiB
PHP
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']);
|
|
}
|
|
});
|
|
});
|
|
}
|
|
}
|