RecordService.php 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. <?php
  2. namespace App\Services\Exam;
  3. use App\Contracts\Repositories\Exam\RecordRepository;
  4. use App\Repositories\Criteria\Exam\RecordCriteria;
  5. use App\Repositories\Eloquent\Exam\RecordRepositoryEloquent;
  6. use App\Repositories\Enums\Exam\TypeEnum;
  7. use App\Repositories\Enums\ModelStatusEnum;
  8. use App\Repositories\Enums\ResponseCodeEnum;
  9. use App\Repositories\Models\Exam\Paper;
  10. use App\Repositories\Models\Exam\Record;
  11. use App\Repositories\Presenters\Exam\RecordPresenter;
  12. use Illuminate\Http\Request;
  13. class RecordService
  14. {
  15. /**
  16. * @var RecordRepositoryEloquent
  17. */
  18. private $recordRepository;
  19. /**
  20. * RecordService constructor.
  21. *
  22. * @param RecordRepositoryEloquent $recordRepositoryEloquent
  23. */
  24. public function __construct(RecordRepositoryEloquent $recordRepositoryEloquent)
  25. {
  26. $this->recordRepository = $recordRepositoryEloquent;
  27. }
  28. /**
  29. * @param Request $request
  30. *
  31. * @return mixed
  32. * @throws \Prettus\Repository\Exceptions\RepositoryException
  33. */
  34. public function handleList(Request $request)
  35. {
  36. $this->recordRepository->pushCriteria(new RecordCriteria($request));
  37. $this->recordRepository->setPresenter(RecordPresenter::class);
  38. return $this->recordRepository->searchRecordsByPage();
  39. }
  40. /**
  41. * @param $id
  42. *
  43. * @return \Illuminate\Database\Eloquent\Model
  44. */
  45. public function handleProfile($id)
  46. {
  47. $this->recordRepository->setPresenter(RecordPresenter::class);
  48. return $this->recordRepository->searchRecordBy($id);
  49. }
  50. /**
  51. * @param array $data
  52. *
  53. * @return mixed
  54. * @throws \Prettus\Validator\Exceptions\ValidatorException
  55. */
  56. public function handleStore($data)
  57. {
  58. $paper = Paper::query()->find($data['paper_id']);
  59. if (!$paper) {
  60. abort('找不到该试卷');
  61. }
  62. $banks = $paper->banks;
  63. $admin_id = login_admin_id();
  64. if (Record::query()->where('paper_id', $paper->id)->where('admin_id', $admin_id)->where('status', ModelStatusEnum::OK)->exists()) {
  65. abort(ResponseCodeEnum::SERVICE_OPERATION_ERROR, '您已经考试过,请勿重复考试');
  66. }
  67. if (strtotime($paper->start_time) > time()) {
  68. abort(ResponseCodeEnum::SERVICE_OPERATION_ERROR, '考试尚未开始');
  69. }
  70. if (strtotime($paper->end_time) < time()) {
  71. abort(ResponseCodeEnum::SERVICE_OPERATION_ERROR, '考试已经结束');
  72. }
  73. if (count($banks) !== count($data['result'])) {
  74. abort(ResponseCodeEnum::SERVICE_OPERATION_ERROR, '试题与答案不匹配!');
  75. return false;
  76. }
  77. $results = $data['result'];
  78. //验证是否合法
  79. foreach ($banks as $key => $topic) {
  80. $k = $key + 1;
  81. if (!isset($results[$key])) {
  82. abort(ResponseCodeEnum::SERVICE_OPERATION_ERROR, "第{$k}条题:答案找不到");
  83. return false;
  84. }
  85. $result = $results[$key];
  86. switch ($topic['type']) {
  87. case TypeEnum::XUANZE:
  88. case TypeEnum::PANDUAN:
  89. //单选
  90. if (!in_array($result, array_column($topic['body'], 'key'))) {
  91. abort(ResponseCodeEnum::SERVICE_OPERATION_ERROR, "第{$k}条题:答案不合法");
  92. return false;
  93. }
  94. break;
  95. case TypeEnum::TIANKONG:
  96. case TypeEnum::JIANDA:
  97. if (!is_string($result)) {
  98. abort(ResponseCodeEnum::SERVICE_OPERATION_ERROR, "第{$k}条题:答案不合法");
  99. return false;
  100. }
  101. break;
  102. case TypeEnum::DUOXUAN:
  103. if (!is_array($result)) {
  104. abort(ResponseCodeEnum::SERVICE_OPERATION_ERROR, "第{$k}条题:答案不合法");
  105. return false;
  106. }
  107. $kk = array_column($topic['body'], 'key');
  108. foreach ($result as $r) {
  109. if (!in_array($r, $kk)) {
  110. abort(ResponseCodeEnum::SERVICE_OPERATION_ERROR, "第{$k}条题:答案不合法");
  111. return false;
  112. }
  113. }
  114. break;
  115. case TypeEnum::DUIBI:
  116. //文本对比结果
  117. if (!is_array($result)) {
  118. abort(ResponseCodeEnum::SERVICE_OPERATION_ERROR, "第{$k}条题:答案不合法");
  119. return false;
  120. }
  121. if (!array_key_exists('daan', $result) || !array_key_exists('zhengquelv', $result)) {
  122. abort(ResponseCodeEnum::SERVICE_OPERATION_ERROR, "第{$k}条题:答案不合法");
  123. return false;
  124. }
  125. $zhengquelv = $result['zhengquelv'];
  126. if ($zhengquelv < 0 || $zhengquelv > 100) {
  127. abort(ResponseCodeEnum::SERVICE_OPERATION_ERROR, "第{$k}条题:答案不合法");
  128. return false;
  129. }
  130. break;
  131. default:
  132. abort(ResponseCodeEnum::SERVICE_OPERATION_ERROR, '找不到改题类型');
  133. }
  134. }
  135. //计算分
  136. $mark = 0;
  137. $is_examines = 0;
  138. $n_results = [];
  139. foreach ($banks as $key => $topic) {
  140. $result = $results[$key];
  141. $n_results[$key]['value'] = $result;
  142. $n_results[$key]['mark'] = 0;
  143. $n_results[$key]['point'] = $topic['point'];
  144. $n_results[$key]['is_examines'] = 0;
  145. $f = false;
  146. switch ($topic['type']) {
  147. case TypeEnum::XUANZE:
  148. //单选
  149. $n_results[$key]['is_examines'] = 1;
  150. if ($result == $topic['result']) {
  151. $mark += $topic['point'];
  152. $n_results[$key]['mark'] = $topic['point'];
  153. }
  154. break;
  155. case TypeEnum::PANDUAN:
  156. $n_results[$key]['is_examines'] = 1;
  157. if ($result == $topic['result']) {
  158. $mark += $topic['point'];
  159. $n_results[$key]['mark'] = $topic['point'];
  160. }
  161. break;
  162. case TypeEnum::TIANKONG:
  163. $n_results[$key]['is_examines'] = 0;
  164. if ($result == $topic['result']) {
  165. $mark += $topic['point'];
  166. $n_results[$key]['mark'] = $topic['point'];
  167. }
  168. $is_examines = 0;
  169. $f = true;
  170. break;
  171. case TypeEnum::JIANDA:
  172. $is_examines = 0;
  173. $f = true;
  174. break;
  175. case TypeEnum::DUOXUAN:
  176. $n_results[$key]['is_examines'] = 1;
  177. if (count($result) <= count($topic['result'])) {
  178. if (count(array_intersect($result, $topic['result'])) == count($topic['result'])) {
  179. $mark += $topic['point'];
  180. $n_results[$key]['mark'] = $topic['point'];
  181. } else {
  182. if (!count(array_diff($result, $topic['result']))) {
  183. $p = ceil($topic['point'] / 2);
  184. $mark += $p;
  185. $n_results[$key]['mark'] = $p;
  186. }
  187. }
  188. }
  189. break;
  190. case TypeEnum::DUIBI:
  191. $n_results[$key]['is_examines'] = 1;
  192. $p = bcmul($topic['point'], bcdiv($result['zhengquelv'], 100, 2), 2);
  193. $mark += $p;
  194. $n_results[$key]['mark'] = $p;
  195. break;
  196. }
  197. }
  198. if ($f) {
  199. $is_examines = 0;
  200. }
  201. Record::query()->create([
  202. 'day' => date('Y-m-d'),
  203. 'paper_id' => $paper->id,
  204. 'banks' => $banks,
  205. 'result' => $n_results,
  206. 'obiective_mark' => $mark,
  207. 'subjective_mark' => 0,
  208. 'is_examines' => $is_examines,
  209. 'mark' => $mark,
  210. 'total_mak' => $mark,
  211. 'admin_id' => $admin_id,
  212. ]);
  213. return true;
  214. }
  215. /**
  216. * @param array $data
  217. *
  218. * @return mixed
  219. * @throws \Prettus\Validator\Exceptions\ValidatorException
  220. */
  221. public function handleUpdate($data)
  222. {
  223. $record = $this->recordRepository->update($data, $data['id']);
  224. return $record;
  225. }
  226. /**
  227. * @param Request $request
  228. *
  229. * @return mixed
  230. * @throws \Prettus\Validator\Exceptions\ValidatorException
  231. */
  232. public function handleDelete($id)
  233. {
  234. return $this->recordRepository->delete($id);
  235. }
  236. }