generated from liutk/owl-admin-base
203 lines
9.9 KiB
PHP
203 lines
9.9 KiB
PHP
<?php
|
|
|
|
namespace App\Admin\Controllers\Train;
|
|
|
|
use App\Admin\Controllers\AdminController;
|
|
use App\Admin\Services\Train\ExaminationService;
|
|
use App\Enums\ExamStatus;
|
|
use App\Enums\QuestionCate;
|
|
use App\Models\Train\Examination;
|
|
use App\Models\Train\Question;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Slowlyo\OwlAdmin\Admin;
|
|
use Slowlyo\OwlAdmin\Renderers\Form;
|
|
use Slowlyo\OwlAdmin\Renderers\Page;
|
|
|
|
/**
|
|
* 考试管理
|
|
*/
|
|
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'))
|
|
->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()->PickerControl()
|
|
->source(admin_url('api/train/questions'))
|
|
->labelField('title')
|
|
->valueField('id')
|
|
->multiple(true)
|
|
->autoFill([
|
|
'questions' => '${items}',
|
|
])
|
|
->value('${questions}')
|
|
->size('lg')
|
|
->pickerSchema(amisMake()->CRUDTable()->mode('table')->syncLocation()->filter($this->baseFilter()->body([
|
|
amisMake()->TextControl()->name('search')->label(__('train_question.title'))->size('md')->clearable(),
|
|
amisMake()->SelectControl()->options(QuestionCate::options())->name('cate')->label(__('train_question.cate'))->size('md')->clearable(),
|
|
]))->columns([
|
|
amisMake()->TableColumn()->name('id')->label(__('train_question.id')),
|
|
amisMake()->TableColumn()->name('title')->label(__('train_question.title')),
|
|
amisMake()->TableColumn()->name('cate')->label(__('train_question.cate'))->type('mapping')->map(QuestionCate::options()),
|
|
amisMake()->TableColumn()->name('created_at')->label(__('train_book.created_at')),
|
|
]))
|
|
->name('question_ids')
|
|
->label(__('train_examination.question_id'))
|
|
->required(),
|
|
amisMake()->TableControl()
|
|
->removable()
|
|
->draggable()
|
|
->showIndex()
|
|
->columnsTogglable(false)
|
|
->needConfirm(false)
|
|
->columns([
|
|
amisMake()->TableColumn()->name('title')->label(__('train_question.title'))->type('static'),
|
|
// amisMake()->TableColumn()->name('cate')->label(__('train_question.cate'))->type('mapping')->map(QuestionCate::options()),
|
|
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}')->columns([
|
|
amisMake()->TableColumn()->name('sort')->label('序号'),
|
|
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());
|
|
}
|
|
}
|
|
}
|