generated from liutk/owl-admin-base
103 lines
3.3 KiB
PHP
103 lines
3.3 KiB
PHP
<?php
|
|
|
|
namespace App\Admin\Services\Train;
|
|
|
|
use App\Admin\Filters\TrainExaminationFilter;
|
|
use App\Models\Train\{Examination, Question};
|
|
use App\Admin\Services\BaseService;
|
|
use Illuminate\Support\Str;
|
|
use Illuminate\Support\Facades\{Validator, Storage};
|
|
use App\Enums\ExamStatus;
|
|
use App\Enums\MessageType;
|
|
use App\Models\Employee;
|
|
use App\Services\MessageService;
|
|
|
|
class ExaminationService extends BaseService
|
|
{
|
|
protected array $withRelationships = [];
|
|
|
|
protected string $modelName = Examination::class;
|
|
|
|
protected string $modelFilterName = TrainExaminationFilter::class;
|
|
|
|
public function resloveData($data, $model = null)
|
|
{
|
|
if (isset($data['questions']) && $data['questions']) {
|
|
$totalQuestions = 0;
|
|
$totalScore = 0;
|
|
$questions = [];
|
|
$ids = array_column($data['questions'], 'question_id');
|
|
$questionList = Question::whereIn('id', $ids)->get();
|
|
foreach ($data['questions'] as $question) {
|
|
$model = $questionList->firstWhere('id', $question['question_id']);
|
|
if ($model) {
|
|
// title: 题目, cate: 类型, options: 选项, score: 分值
|
|
$question['title'] = $model->title;
|
|
$question['cate'] = $model->cate;
|
|
$question['options'] = $model->options;
|
|
array_push($questions, $question);
|
|
|
|
$totalQuestions++;
|
|
$totalScore+=$question['score'];
|
|
}
|
|
}
|
|
$data['questions'] = $questions;
|
|
$data['total_questions'] = $totalQuestions;
|
|
$data['total_score'] = $totalScore;
|
|
}
|
|
return $data;
|
|
}
|
|
|
|
public function publish(Examination $examination, array $ids)
|
|
{
|
|
if ($examination->exam_status == ExamStatus::Published) {
|
|
return $this->setError('已经发布了');
|
|
}
|
|
|
|
$questions = [];
|
|
foreach($examination->questions as $question) {
|
|
$question['options'] = array_map(function ($option) {
|
|
$option['selected'] = false;
|
|
return $option;
|
|
}, $question['options']);
|
|
array_push($questions, $question);
|
|
}
|
|
$employees = Employee::whereIn('id', $ids)->get();
|
|
// 为员工生成考卷
|
|
foreach ($employees as $employee) {
|
|
$examination->papers()->create([
|
|
'employee_id' => $employee->id,
|
|
'content' => $questions,
|
|
]);
|
|
}
|
|
|
|
$examination->update(['exam_status' => ExamStatus::Published, 'published_at' => now()]);
|
|
|
|
(new MessageService())->create(
|
|
MessageType::Exam,
|
|
'考试通知',
|
|
'您有一张待完成试卷,请尽快完成考试。',
|
|
$employees->all(),
|
|
[
|
|
'examination' => [
|
|
'id' => $examination->id,
|
|
'name' => $examination->name,
|
|
],
|
|
]
|
|
);
|
|
|
|
return true;
|
|
}
|
|
|
|
public function cancel(Examination $examination)
|
|
{
|
|
if ($examination->exam_status == ExamStatus::None) {
|
|
return $this->setError('已经取消了');
|
|
}
|
|
$examination->papers()->delete();
|
|
$examination->update(['exam_status' => ExamStatus::None, 'published_at' => null]);
|
|
|
|
return true;
|
|
}
|
|
}
|