PaperResultsController.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416
  1. <?php
  2. namespace App\Http\Controllers\Admin\Exam;
  3. use App\Http\Controllers\Controller;
  4. use App\Repositories\Enums\Exam\TypeEnum;
  5. use App\Repositories\Enums\ModelStatusEnum;
  6. use App\Repositories\Enums\PermissionEnum;
  7. use App\Repositories\Enums\ResponseCodeEnum;
  8. use App\Repositories\Models\Base\Admin;
  9. use App\Repositories\Models\Dianli\Task;
  10. use App\Repositories\Models\Exam\Paper;
  11. use App\Repositories\Models\Exam\PaperResult;
  12. use Carbon\Carbon;
  13. use Illuminate\Http\Request;
  14. use Jiannei\Response\Laravel\Support\Facades\Response;
  15. use Prettus\Validator\Contracts\ValidatorInterface;
  16. use App\Contracts\Repositories\Exam\PaperResultRepository;
  17. use App\Repositories\Validators\Exam\PaperResultValidator;
  18. /**
  19. * Class PaperResultsController.
  20. *
  21. * @package namespace App\Http\Controllers\Exam;
  22. */
  23. class PaperResultsController extends Controller
  24. {
  25. /**
  26. * @var PaperResultRepository
  27. */
  28. protected $repository;
  29. /**
  30. * @var PaperResultValidator
  31. */
  32. protected $validator;
  33. /**
  34. * PaperResultsController constructor.
  35. *
  36. * @param PaperResultRepository $repository
  37. * @param PaperResultValidator $validator
  38. */
  39. public function __construct(PaperResultRepository $repository, PaperResultValidator $validator)
  40. {
  41. $this->repository = $repository;
  42. $this->validator = $validator;
  43. }
  44. /**
  45. * 列表
  46. * @param Request $request
  47. * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource
  48. * Author: Mead
  49. */
  50. public function index(Request $request)
  51. {
  52. $this->isCan(PermissionEnum::controller_paperResult_list);
  53. $lists = $this->repository->paginate($request->get('per_page', self::PAGE_NUM));
  54. return Response::success($lists);
  55. }
  56. /**
  57. * 添加
  58. * @param Request $request
  59. * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource|void
  60. * @throws \Illuminate\Validation\ValidationException
  61. * Author: Mead
  62. */
  63. public function store(Request $request)
  64. {
  65. $this->validate($request, $this->validator->getRules(ValidatorInterface::RULE_CREATE));
  66. $data = $request->only(array_keys($this->validator->getRules(ValidatorInterface::RULE_CREATE)));
  67. $type = $request->get('type');
  68. if (in_array($type, [1, 2, 5])) {
  69. $this->validate($request, [
  70. 'body' => 'required'
  71. ]);
  72. }
  73. try {
  74. $data['admin_id'] = login_admin_id();
  75. $model = $this->repository->create($data);
  76. return Response::success($model);
  77. } catch (\Exception $e) {
  78. return $this->error($e);
  79. }
  80. }
  81. /**
  82. * 详情
  83. * @param $id
  84. * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource
  85. * Author: Mead
  86. */
  87. public function show($id)
  88. {
  89. $data = $this->repository->find($id);
  90. return Response::success($data);
  91. }
  92. /**
  93. * 更新
  94. * @param Request $request
  95. * @param $id
  96. * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource
  97. * @throws \Illuminate\Validation\ValidationException
  98. * Author: Mead
  99. */
  100. public function update(Request $request, $id)
  101. {
  102. $this->validate($request, $this->validator->getRules(ValidatorInterface::RULE_UPDATE));
  103. $data = $request->only(array_keys($this->validator->getRules(ValidatorInterface::RULE_CREATE)));
  104. $type = $request->get('type');
  105. if (in_array($type, [1, 2, 5])) {
  106. $this->validate($request, [
  107. 'body' => 'required'
  108. ]);
  109. }
  110. try {
  111. $model = $this->repository->update($data, $id);
  112. return Response::success($model);
  113. } catch (\Exception $e) {
  114. $this->error($e);
  115. }
  116. }
  117. /**
  118. * 删除
  119. * @param $id
  120. * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource
  121. * Author: Mead
  122. */
  123. public function destroy($id)
  124. {
  125. try {
  126. $this->repository->skipPresenter()->delete($id);
  127. return Response::success(null, T('successfully delete.'));
  128. } catch (\Exception $exception) {
  129. return Response::fail(T('Delete failed.'), ResponseCodeEnum::SERVICE_UPDATE_DATA_ERROR);
  130. }
  131. }
  132. /**
  133. * 批量删除
  134. * @param Request $request
  135. * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource
  136. * Author: Mead
  137. */
  138. public function delete(Request $request)
  139. {
  140. try {
  141. $this->validate($request, [
  142. 'ids' => 'required|array',
  143. ]);
  144. $ids = $request->get('ids');
  145. $this->repository->whereIn('id', $ids)->delete();
  146. return Response::success(null, T('successfully delete.'));
  147. } catch (\Exception $exception) {
  148. return Response::fail(T('Delete failed.'), ResponseCodeEnum::SERVICE_UPDATE_DATA_ERROR);
  149. }
  150. }
  151. /**
  152. * 选项
  153. * @param Request $request
  154. * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource
  155. * Author: Mead
  156. */
  157. public function selectOptions(Request $request)
  158. {
  159. $data = $this->repository->skipPresenter()->all(['name', 'id']);
  160. return Response::success($data);
  161. }
  162. /**
  163. * 暂停
  164. * @param Request $request
  165. * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource
  166. * @throws \Illuminate\Validation\ValidationException
  167. */
  168. public function pause(Request $request)
  169. {
  170. $this->validate($request, [
  171. 'id' => 'required|integer',
  172. 'type' => 'sometimes|nullable|integer',
  173. ]);
  174. $status = ModelStatusEnum::PAUSE;
  175. if ($request->get('type')) {
  176. $status = ModelStatusEnum::OK;
  177. }
  178. $re = PaperResult::query()->where('id', $request->get('id'))->update(['status' => $status]);
  179. if ($re) {
  180. return Response::success([]);
  181. }
  182. return $this->error('操作失败');
  183. }
  184. /**
  185. * 分配任务
  186. * @param Request $request
  187. * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource
  188. * @throws \Illuminate\Validation\ValidationException
  189. */
  190. public function allot(Request $request)
  191. {
  192. $this->validate($request, [
  193. 'task_id' => 'required|integer',
  194. 'admin_ids' => 'required|array',
  195. 'day' => 'required|date',
  196. 'assign_admin_id' => 'sometimes|integer',
  197. ]);
  198. $this->isCanAny([PermissionEnum::controller_task_allot, PermissionEnum::controller_task_allot_all]);
  199. if ($this->isCan(PermissionEnum::controller_task_allot_all, true)) {
  200. $this->validate($request, [
  201. 'assign_admin_id' => 'required|integer',
  202. ]);
  203. }
  204. $task_id = $request->get('task_id');
  205. $day = $request->get('day');
  206. $admin_ids = $request->get('admin_ids', []);
  207. $admin_id = login_admin_id();
  208. $assign_admin_id = $request->get('assign_admin_id', $admin_id);
  209. $task = false;
  210. if ($this->isCan(PermissionEnum::controller_task_allot_all, true)) {
  211. $task = Task::query()->where('id', $task_id)->where('status', ModelStatusEnum::OK)->first();
  212. } else {
  213. $task = Task::query()->where('id', $task_id)->where('assign_admin_ids', 'like', "%-{$assign_admin_id}-%")->where('status', ModelStatusEnum::OK)->first();
  214. }
  215. if (!$task) {
  216. return $this->error('找不到该任务');
  217. }
  218. $admins = Admin::query()->whereIn('id', $admin_ids)->where('status', ModelStatusEnum::OK)->count();
  219. if ($admins !== count($admin_ids)) {
  220. return $this->error('巡检员数量不对');
  221. }
  222. foreach ($admin_ids as $admin) {
  223. PaperResult::query()->create([
  224. 'day' => $day,
  225. 'paper_id' => $task->paper_id,
  226. 'assign_admin_id' => $assign_admin_id,
  227. 'polling_admin_id' => $admin,
  228. 'admin_id' => $admin_id,
  229. 'is_answer' => 0,
  230. 'status' => 1,
  231. ]);
  232. }
  233. return Response::success([]);
  234. }
  235. /**
  236. * 答题
  237. * @param Request $request
  238. * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource
  239. * @throws \Illuminate\Validation\ValidationException
  240. */
  241. public function answer(Request $request)
  242. {
  243. $this->isCan(PermissionEnum::controller_paperResult_answer);
  244. $this->validate($request, [
  245. 'id' => 'required|integer',
  246. 'results' => 'required|array',
  247. 'is_exist_danger' => 'required|in:0,1',
  248. 'remark' => 'sometimes|nullable',
  249. 'imgs' => 'sometimes|nullable|array',
  250. ]);
  251. $id = $request->get('id');
  252. $is_exist_danger = $request->get('is_exist_danger', 0);
  253. $remark = $request->get('remark');
  254. $results = $request->get('results', []);
  255. $imgs = $request->get('imgs', []);
  256. // ->where('polling_admin_id', login_admin_id())
  257. $model = PaperResult::query()->where('id', $id)->first();
  258. if (!$model) {
  259. return $this->error('找不到该任务');
  260. }
  261. if ($model->is_answer) {
  262. return $this->error('该任务您已经完成');
  263. }
  264. $paper = Paper::query()->find($model->paper_id);
  265. $topics = $paper->topics;
  266. if (count($topics) !== count($results)) {
  267. return $this->error('试题与答案不匹配!');
  268. }
  269. //验证是否合法
  270. foreach ($topics as $key => $topic) {
  271. $k = $key + 1;
  272. if (!isset($results[$key])) {
  273. return $this->error("第{$k}条题:答案找不到");
  274. }
  275. $result = $results[$key];
  276. switch ($topic->type) {
  277. case TypeEnum::XUANZE:
  278. case TypeEnum::PANDUAN:
  279. //单选
  280. if (!in_array($result, array_column($topic->body, 'key'))) {
  281. return $this->error("第{$k}条题:答案不合法");
  282. }
  283. break;
  284. case TypeEnum::TIANKONG:
  285. case TypeEnum::JIANDA:
  286. if (!is_string($result)) {
  287. return $this->error("第{$k}条题:答案不合法");
  288. }
  289. break;
  290. case TypeEnum::DUOXUAN:
  291. if (!is_array($result)) {
  292. return $this->error("第{$k}条题:答案不合法");
  293. }
  294. $kk = array_column($topic->body, 'key');
  295. foreach ($result as $r) {
  296. if (!in_array($r, $kk)) {
  297. return $this->error("第{$k}条题:答案不合法");
  298. }
  299. }
  300. break;
  301. }
  302. }
  303. //计算分
  304. $mark = 0;
  305. $is_examines = 0;
  306. $n_results = [];
  307. foreach ($topics as $key => $topic) {
  308. $result = $results[$key];
  309. $n_results[$key]['value'] = $result;
  310. $n_results[$key]['mark'] = 0;
  311. $n_results[$key]['point'] = $topic->point;
  312. $n_results[$key]['is_examines'] = 0;
  313. $f = false;
  314. switch ($topic->type) {
  315. case TypeEnum::XUANZE:
  316. //单选
  317. $n_results[$key]['is_examines'] = 1;
  318. if ($result == $topic->result) {
  319. $mark += $topic->point;
  320. $n_results[$key]['mark'] = $topic->point;
  321. }
  322. break;
  323. case TypeEnum::PANDUAN:
  324. $n_results[$key]['is_examines'] = 1;
  325. if ($result == $topic->result) {
  326. $mark += $topic->point;
  327. $n_results[$key]['mark'] = $topic->point;
  328. }
  329. break;
  330. case TypeEnum::TIANKONG:
  331. $n_results[$key]['is_examines'] = 0;
  332. if ($result == $topic->result) {
  333. $mark += $topic->point;
  334. $n_results[$key]['mark'] = $topic->point;
  335. }
  336. $is_examines = 0;
  337. $f = true;
  338. break;
  339. case TypeEnum::JIANDA:
  340. $is_examines = 0;
  341. $f = true;
  342. break;
  343. case TypeEnum::DUOXUAN:
  344. $n_results[$key]['is_examines'] = 1;
  345. if (count($result) <= count($topic->result)) {
  346. if (count(array_intersect($result, $topic->result)) == count($topic->result)) {
  347. $mark += $topic->point;
  348. $n_results[$key]['mark'] = $topic->point;
  349. } else {
  350. if (!count(array_diff($result, $topic->result))) {
  351. $p = ceil($topic->point / 2);
  352. $mark += $p;
  353. $n_results[$key]['mark'] = $p;
  354. }
  355. }
  356. }
  357. break;
  358. }
  359. }
  360. if ($f) {
  361. $is_examines = 0;
  362. }
  363. $model->result = $n_results;
  364. $model->obiective_mark = $mark;
  365. $model->subjective_mark = 0;
  366. $model->mark = $mark;
  367. $model->is_examines = $is_examines;
  368. $model->total_mak = $paper->mark;
  369. $model->is_exist_danger = $is_exist_danger;
  370. $model->is_answer = 1;
  371. $model->remark = $remark;
  372. $model->imgs = $imgs;
  373. $model->answer_at = Carbon::now();
  374. $model->save();
  375. $paper->submit_nums += $paper->submit_nums;
  376. $paper->save();
  377. return Response::success([]);
  378. }
  379. }