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()); } } }