recordRepository = $recordRepositoryEloquent; } /** * @param Request $request * * @return mixed * @throws \Prettus\Repository\Exceptions\RepositoryException */ public function handleList(Request $request) { $this->recordRepository->pushCriteria(new RecordCriteria($request)); $this->recordRepository->setPresenter(RecordPresenter::class); return $this->recordRepository->searchRecordsByPage(); } /** * @param $id * * @return \Illuminate\Database\Eloquent\Model */ public function handleProfile($id) { $this->recordRepository->setPresenter(RecordPresenter::class); return $this->recordRepository->searchRecordBy($id); } /** * @param array $data * * @return mixed * @throws \Prettus\Validator\Exceptions\ValidatorException */ public function handleStore($data) { $paper = Paper::query()->find($data['paper_id']); if (!$paper) { abort('找不到该试卷'); } $banks = $paper->banks; $admin_id = login_admin_id(); if (Record::query()->where('paper_id', $paper->id)->where('admin_id', $admin_id)->where('status', ModelStatusEnum::OK)->exists()) { abort(ResponseCodeEnum::SERVICE_OPERATION_ERROR, '您已经考试过,请勿重复考试'); } if (strtotime($paper->start_time) > time()) { abort(ResponseCodeEnum::SERVICE_OPERATION_ERROR, '考试尚未开始'); } if (strtotime($paper->end_time) < time()) { abort(ResponseCodeEnum::SERVICE_OPERATION_ERROR, '考试已经结束'); } if (count($banks) !== count($data['result'])) { abort(ResponseCodeEnum::SERVICE_OPERATION_ERROR, '试题与答案不匹配!'); return false; } $results = $data['result']; //验证是否合法 foreach ($banks as $key => $topic) { $k = $key + 1; if (!isset($results[$key])) { abort(ResponseCodeEnum::SERVICE_OPERATION_ERROR, "第{$k}条题:答案找不到"); return false; } $result = $results[$key]; switch ($topic['type']) { case TypeEnum::XUANZE: case TypeEnum::PANDUAN: //单选 if (!in_array($result, array_column($topic['body'], 'key'))) { abort(ResponseCodeEnum::SERVICE_OPERATION_ERROR, "第{$k}条题:答案不合法"); return false; } break; case TypeEnum::TIANKONG: case TypeEnum::JIANDA: if (!is_string($result)) { abort(ResponseCodeEnum::SERVICE_OPERATION_ERROR, "第{$k}条题:答案不合法"); return false; } break; case TypeEnum::DUOXUAN: if (!is_array($result)) { abort(ResponseCodeEnum::SERVICE_OPERATION_ERROR, "第{$k}条题:答案不合法"); return false; } $kk = array_column($topic['body'], 'key'); foreach ($result as $r) { if (!in_array($r, $kk)) { abort(ResponseCodeEnum::SERVICE_OPERATION_ERROR, "第{$k}条题:答案不合法"); return false; } } break; case TypeEnum::DUIBI: //文本对比结果 if (!is_array($result)) { abort(ResponseCodeEnum::SERVICE_OPERATION_ERROR, "第{$k}条题:答案不合法"); return false; } if (!array_key_exists('daan', $result) || !array_key_exists('zhengquelv', $result)) { abort(ResponseCodeEnum::SERVICE_OPERATION_ERROR, "第{$k}条题:答案不合法"); return false; } $zhengquelv = $result['zhengquelv']; if ($zhengquelv < 0 || $zhengquelv > 100) { abort(ResponseCodeEnum::SERVICE_OPERATION_ERROR, "第{$k}条题:答案不合法"); return false; } break; default: abort(ResponseCodeEnum::SERVICE_OPERATION_ERROR, '找不到改题类型'); } } //计算分 $mark = 0; $is_examines = 0; $n_results = []; foreach ($banks as $key => $topic) { $result = $results[$key]; $n_results[$key]['value'] = $result; $n_results[$key]['mark'] = 0; $n_results[$key]['point'] = $topic['point']; $n_results[$key]['is_examines'] = 0; $f = false; switch ($topic['type']) { case TypeEnum::XUANZE: //单选 $n_results[$key]['is_examines'] = 1; if ($result == $topic['result']) { $mark += $topic['point']; $n_results[$key]['mark'] = $topic['point']; } break; case TypeEnum::PANDUAN: $n_results[$key]['is_examines'] = 1; if ($result == $topic['result']) { $mark += $topic['point']; $n_results[$key]['mark'] = $topic['point']; } break; case TypeEnum::TIANKONG: $n_results[$key]['is_examines'] = 0; if ($result == $topic['result']) { $mark += $topic['point']; $n_results[$key]['mark'] = $topic['point']; } $is_examines = 0; $f = true; break; case TypeEnum::JIANDA: $is_examines = 0; $f = true; break; case TypeEnum::DUOXUAN: $n_results[$key]['is_examines'] = 1; if (count($result) <= count($topic['result'])) { if (count(array_intersect($result, $topic['result'])) == count($topic['result'])) { $mark += $topic['point']; $n_results[$key]['mark'] = $topic['point']; } else { if (!count(array_diff($result, $topic['result']))) { $p = ceil($topic['point'] / 2); $mark += $p; $n_results[$key]['mark'] = $p; } } } break; case TypeEnum::DUIBI: $n_results[$key]['is_examines'] = 1; $p = bcmul($topic['point'], bcdiv($result['zhengquelv'], 100, 2), 2); $mark += $p; $n_results[$key]['mark'] = $p; break; } } if ($f) { $is_examines = 0; } Record::query()->create([ 'day' => date('Y-m-d'), 'paper_id' => $paper->id, 'banks' => $banks, 'result' => $n_results, 'obiective_mark' => $mark, 'subjective_mark' => 0, 'is_examines' => $is_examines, 'mark' => $mark, 'total_mak' => $mark, 'admin_id' => $admin_id, ]); return true; } /** * @param array $data * * @return mixed * @throws \Prettus\Validator\Exceptions\ValidatorException */ public function handleUpdate($data) { $record = $this->recordRepository->update($data, $data['id']); return $record; } /** * @param Request $request * * @return mixed * @throws \Prettus\Validator\Exceptions\ValidatorException */ public function handleDelete($id) { return $this->recordRepository->delete($id); } }