store-manage/app/Admin/Controllers/Train/ExaminationController.php

179 lines
8.5 KiB
PHP

<?php
namespace App\Admin\Controllers\Train;
use App\Admin\Controllers\AdminController;
use App\Admin\Services\Train\ExaminationService;
use Slowlyo\OwlAdmin\Admin;
use Slowlyo\OwlAdmin\Renderers\Form;
use Slowlyo\OwlAdmin\Renderers\Page;
use App\Enums\{ExamStatus, QuestionCate};
use App\Models\Train\{Question, Examination};
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
/**
* 考试管理
*/
class ExaminationController extends AdminController
{
protected string $serviceName = ExaminationService::class;
public function list(): Page
{
$crud = $this->baseCRUD()
->tableLayout('fixed')
->headerToolbar([
$this->createButton()->visible(Admin::user()->can('admin.train.examinations.create')),
...$this->baseHeaderToolBar(),
])
->bulkActions([])
->filter($this->baseFilter()->body([
amis()->GroupControl()->mode('horizontal')->body([
amisMake()->TextControl()->name('search')->label(__('train_examination.name'))->columnRatio(3)->clearable(),
amisMake()->SelectControl()->options(ExamStatus::options())->name('exam_status')->label(__('train_examination.exam_status'))->columnRatio(3)->clearable(),
]),
]))
->filterDefaultVisible()
->columns([
amisMake()->TableColumn()->name('id')->label(__('train_examination.id')),
amisMake()->TableColumn()->name('name')->label(__('train_examination.name')),
amisMake()->TableColumn()->name('exam_status')->label(__('train_examination.exam_status'))->set('type', 'mapping')->set('map', ExamStatus::options()),
amisMake()->TableColumn()->name('total_questions')->label(__('train_examination.total_questions')),
amisMake()->TableColumn()->name('total_score')->label(__('train_examination.total_score')),
amisMake()->TableColumn()->name('total_finished')->label(__('train_examination.total_finished'))
->set('type', 'tpl')
->tpl('${COUNT(ARRAYFILTER(papers, item => item.finished_at))}/${COUNT(papers)}'),
amisMake()->TableColumn()->name('published_at')->label(__('train_examination.published_at')),
$this->rowActions([
$this->rowShowButton()
->visible(Admin::user()->can('admin.train.examinations.view')),
$this->rowEditButton()
->visible(Admin::user()->can('admin.train.examinations.update'))
->visibleOn('${exam_status == '.ExamStatus::None->value.'}'),
$this->rowDeleteButton()
->visible(Admin::user()->can('admin.train.examinations.delete'))
->visibleOn('${exam_status == '.ExamStatus::None->value.'}'),
amisMake()->DialogAction()->dialog(
amisMake()->Dialog()->title('选择参考员工')->size('lg')->body(
amisMake()->Form()->api('post:' . admin_url('train/examinations/${id}/publish'))->body([
amisMake()->TransferControl()
->name('employee_id')
->source(admin_url('api/employees?enable=1&store_id_gt=0'))
->joinValues(false)
->extractValue()
->labelField('name')
->valueField('id')
->searchable()
->required(),
])
)
)
->label(__('train_examination.publish'))
->level('link')
->visible(Admin::user()->can('admin.train.examinations.publish'))
->visibleOn('${exam_status == '.ExamStatus::None->value.'}'),
amisMake()->AjaxAction()->api('post:' . admin_url('train/examinations/${id}/cancel'))
->label(__('train_examination.cancel'))
->level('link')
->confirmText('删除该考试下所有试卷记录, 是否确定?')
->visible(Admin::user()->can('admin.train.examinations.cancel'))
->visibleOn('${exam_status == '.ExamStatus::Published->value.'}'),
]),
]);
return $this->baseList($crud);
}
public function form($edit): Form
{
return $this->baseForm()->title('')->body([
amisMake()->TextControl()->name('name')->label(__('train_examination.name'))->required(),
amisMake()->TableControl()
->addable()
->editable()
->removable()
->showIndex()
->needConfirm(false)
->columns([
amisMake()->SelectControl()
->options(Question::get())
->labelField('title')
->valueField('id')
->searchable()
->name('question_id')
->label(__('train_examination.question_id'))
->required(),
amisMake()->NumberControl()->min(0)->step(1)->precision(0)->name('score')->label(__('train_examination.score'))->required(),
])
->name('questions')
->label(__('train_examination.questions')),
]);
}
public function detail(): Form
{
$detail = amisMake()->Property()->items([
['label' => __('train_examination.name'), 'content' => '${name}'],
['label' => __('train_examination.exam_status'), 'content' => amisMake()->Mapping()->map(ExamStatus::options())->name('exam_status')],
['label' => __('train_examination.published_at'), 'content' => '${published_at}'],
['label' => __('train_examination.total_questions'), 'content' => '${total_questions}'],
['label' => __('train_examination.total_score'), 'content' => '${total_score}'],
['label' => __('train_examination.created_at'), 'content' => '${created_at}'],
['label' => __('train_examination.total_finished'), 'content' => '${total_finished}'],
['label' => __('train_examination.max_mark'), 'content' => '${max_mark}'],
['label' => __('train_examination.min_mark'), 'content' => '${min_mark}'],
['label' => __('train_examination.avg_mark'), 'content' => '${avg_mark}', 'span' => 3],
]);
$question = amisMake()->Table()->source('${questions}')->showIndex()->columns([
amisMake()->TableColumn()->name('title')->label(__('train_question.title')),
amisMake()->TableColumn()->name('cate')->label(__('train_question.cate'))->set('type', 'mapping')->map(QuestionCate::options()),
amisMake()->TableColumn()->name('options')->label(__('train_question.options'))->set('type', 'list')->source('${options}')->listItem([
'titleClassName' => 'text-${IF(is_true, "success", "danger")}',
'title' => '${text}',
]),
amisMake()->TableColumn()->name('score')->label(__('train_examination.score')),
]);
return $this->baseDetail()->title('')->body([$detail, amisMake()->Divider(), $question]);
}
public function publish($id, Request $request)
{
$request->validate([
'employee_id' => 'required'
]);
$info = Examination::findOrFail($id);
try {
DB::beginTransaction();
if (!$this->service->publish($info, $request->input('employee_id'))) {
return $this->response()->fail($this->service->getError());
}
DB::commit();
return $this->response()->success();
} catch (\Exception $e) {
DB::rollBack();
return $this->response()->fail($e->getMessage());
}
}
public function cancel($id, Request $request)
{
$info = Examination::findOrFail($id);
try {
DB::beginTransaction();
if (!$this->service->cancel($info)) {
return $this->response()->fail($this->service->getError());
}
DB::commit();
return $this->response()->success();
} catch (\Exception $e) {
DB::rollBack();
return $this->response()->fail($e->getMessage());
}
}
}