Exam.php 46 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066
  1. <?php
  2. namespace app\api\controller;
  3. use app\logics\OrgLogic;
  4. use app\model\ExamEmpResult;
  5. use app\model\ExamPaper;
  6. use app\model\Org;
  7. use app\model\Employee;
  8. use app\model\ExamPaperQuestion;
  9. use app\model\ExamQuestion;
  10. use app\event\Msg;
  11. /*
  12. * 获客工具块
  13. */
  14. class Exam extends Base
  15. {
  16. /**
  17. * 考试,试卷列表
  18. */
  19. public function paperlist()
  20. {
  21. $token = $this->request->token;
  22. $param = request()->param();
  23. $type = input('type', 0); //0全部,1以考试,2未考试
  24. $now = time();
  25. if ($type == 0) { // 查询全部
  26. $where = [
  27. ['state', '=', 1],
  28. ['root_id', '=', $token['root_org']],
  29. ['for_newbie', '=', 0] // 不包含新兵训练营
  30. ];
  31. $paper_id = ExamPaper::where($where)->whereRaw("FIND_IN_SET(" . $token['employee_id'] . " , assessment)")->order('id desc')->page($param['page'], $param['limit'])->column('id');
  32. $count = ExamPaper::where($where)->whereRaw("FIND_IN_SET(" . $token['employee_id'] . " , assessment)")->count();
  33. } else {
  34. $w[] = ['root_id', '=', $token['root_org']];
  35. $w[] = ['employee_id', '=', $token['employee_id']];
  36. $w[] = ['from', '=', 0];
  37. if ($type == 1) {
  38. $w[] = ['approve_status', '>=', 0];
  39. } elseif ($type == 3) {
  40. $w[] = ['approve_status', '=', -1];
  41. $w[] = ['endmaketime', '>', $now];
  42. }
  43. if ($type == 2) { // 查询未参加考试的
  44. $paper_id = ExamEmpResult::where($w)->column('paper_id');
  45. $where = [
  46. ['state', '=', 1],
  47. ['root_id', '=', $token['root_org']],
  48. ['id', 'not in', $paper_id],
  49. ['for_newbie', '=', 0] // 不包含新兵训练营
  50. ];
  51. $paper_id = ExamPaper::where($where)->whereRaw("FIND_IN_SET(" . $token['employee_id'] . " , assessment)")->order('id desc')->page($param['page'], $param['limit'])->whereRaw("FIND_IN_SET(" . $token['employee_id'] . " , assessment)")->column('id');
  52. $count = ExamPaper::where($where)->count();
  53. } else { // 查询考试中(试卷考试时间未结束)和已考试的
  54. $paper_id = ExamEmpResult::where($w)->order('paper_id desc')->page($param['page'], $param['limit'])->column('paper_id');
  55. $count = ExamEmpResult::where($w)->count();
  56. }
  57. }
  58. $list = ExamPaper::with(['result' => function ($query) use ($token) {
  59. $query->where([['root_id', '=', $token['root_org']], ['employee_id', '=', $token['employee_id']], ['from', '=', 0]]);
  60. }])->where([['id', 'in', $paper_id]])->order('addtime desc')
  61. ->select();
  62. foreach ($list as $k => &$paper) {
  63. if ($paper->result->isEmpty()) {
  64. $paper['done'] = 0;
  65. } elseif ($paper->result[0]->approve_status < 0 && $paper->result[0]->endmaketime > $now) {
  66. $paper['done'] = 2;
  67. } else {
  68. $paper['done'] = 1;
  69. }
  70. //以阅卷和待阅卷数量
  71. $paper['d_marking'] = $paper['y_marking'] = 0;
  72. foreach ($paper['result'] as $v2) {
  73. if ($v2['approve_status'] == -1 && $v2['endmaketime'] > $now) continue;
  74. $v2['approve_status'] == 2 ? $paper['y_marking'] += 1 : $paper['d_marking'] += 1;
  75. }
  76. unset($list[$k]['result']);
  77. $time = strtotime($paper->endtime) - $now;
  78. $paper['daynum'] = $time > 0 ? $time : 0;
  79. }
  80. return json(['code' => 0, 'data' => $list, 'count' => $count, 'msg' => '获取成功']);
  81. }
  82. /**
  83. * 考卷详情
  84. */
  85. public function paperdetail()
  86. {
  87. $request = request();
  88. $token = $this->request->token;
  89. $from = input('from', 0);
  90. $paperid = $request->param('paperid');
  91. $where[] = ['root_id', '=', $token['root_org']];
  92. $where[] = ['id', '=', $paperid];
  93. $paperInfo = ExamPaper::where($where)->find();
  94. if (empty($paperInfo)) return json(['code' => 1, 'msg' => '试卷不存在']);
  95. foreach ($paperInfo->questions as &$v) {
  96. $v['ask'] = str_replace('\\', '', $v['ask']);
  97. if ($v['type'] == '单选' || $v['type'] == '多选') {
  98. $v['types'] = 1;
  99. $con = json_decode($v['content'], true);
  100. $op = [];
  101. foreach ($con as $v2) {
  102. $op[$v2['title']] = $v2['content'];
  103. }
  104. $v['content'] = $op;
  105. $v['answer'] = explode(',', $v['answer']);
  106. } elseif ($v['type'] == '判断') {
  107. $v['types'] = 2;
  108. } elseif ($v['type'] == '简答') {
  109. $v['types'] = 3;
  110. }
  111. }
  112. $answer_existed = ExamEmpResult::where(['from' => $from, 'employee_id' => $request->param('employee_id'), 'paper_id' => $paperid, 'root_id' => $token['root_org']])->find();
  113. if ($answer_existed) {
  114. $paperInfo['done'] = $answer_existed->approve_status == -1 ? 2 : 1;
  115. $paperInfo['checked'] = ($answer_existed->checked) ? 1 : 0;
  116. $paperInfo['final_score'] = $answer_existed['final_score'] ?: 0;
  117. $paperInfo['approve_status'] = $answer_existed->approve_status;
  118. $paperInfo['answer'] = json_decode($answer_existed->answer, true);
  119. $paperInfo['startmaketime'] = $answer_existed->endmaketime - time();
  120. } else {
  121. $paperInfo['done'] = 0;
  122. $paperInfo['checked'] = 0;
  123. $paperInfo['final_score'] = 0;
  124. $paperInfo['approve_status'] = 0;
  125. }
  126. $paperInfo['is_ok'] = $paperInfo['base_score'] <= $paperInfo['final_score'] && $paperInfo['final_score'] > 0 ? '是' : '否';
  127. //返回指派考试人员名称
  128. $paperInfo['employee'] = Employee::where([['root_id', '=', $token['root_org']], ['uid', '<>', 0], ['state', '=', '在职'], ['id', 'in', explode(',', $paperInfo['assessment'])]])->column('name');
  129. //返回指派考试人员名称
  130. $paperInfo['employee'] = Employee::where([['root_id', '=', $token['root_org']], ['uid', '<>', 0], ['state', '=', '在职'], ['id', 'in', explode(',', $paperInfo['assessment'])]])->column('name');
  131. return json(['code' => 0, 'paperInfo' => $paperInfo, 'msg' => '获取成功']);
  132. }
  133. /**
  134. * 答题存储
  135. */
  136. public function answer()
  137. {
  138. // 参数:谁,答了哪个试卷的那道题,答案是多少
  139. $param = $this->request->only(['paper_id', 'question', 'answer']);
  140. $token = $this->request->token;
  141. // 查找试卷是否存在
  142. $paper = ExamPaper::where(['root_id' => $token['root_org'], 'id' => $param['paper_id']])->find();
  143. if (empty($paper)) return json(['code' => 1, 'msg' => '试卷不存在']);
  144. if ($paper->endtime < date("Y-m-d H:i:s")) return json(['code' => 1, 'msg' => '答题时间已结束']);
  145. if ($param['question'] != 0) {
  146. // 查找试题
  147. $question = ExamPaperQuestion::where(['root_id' => $token['root_org'], 'question_id' => $param['question'], 'paper_id' => $param['paper_id']])->find();
  148. if (empty($question)) return json(['code' => 1, 'msg' => '试题不存在']);
  149. }
  150. // 查找答题记录
  151. $condition = [
  152. 'employee_id' => $token['employee_id'],
  153. 'paper_id' => $param['paper_id'],
  154. 'root_id' => $token['root_org'],
  155. 'from' => $paper->for_newbie
  156. ];
  157. // 如果是新兵训练营,可以多次考试
  158. if ($paper->for_newbie == 1) {
  159. $condition['approve_status'] = -1;
  160. }
  161. $answer = ExamEmpResult::where($condition)->findOrEmpty();
  162. if (!$answer->isEmpty() && $param['question'] == 0) return json(['code' => 1, 'msg' => '考试已开始']);
  163. $saveData = [];
  164. // 判断是否有答题记录
  165. if ($answer->isEmpty()) { // 没有答题记录则添加答题记录
  166. $saveData = [
  167. 'employee_id' => $token['employee_id'],
  168. 'paper_id' => $param['paper_id'],
  169. 'root_id' => $token['root_org'],
  170. 'startmaketime' => date('Y-m-d H:i:s'),
  171. 'from' => $paper->for_newbie,
  172. 'approve_status' => -1, // 答题中
  173. ];
  174. if ($param['question'] != 0) $saveData['answer'] = json_encode([$question->question_id => $param['answer']]);
  175. // 计算考试结束时间(考试的结束时间如果大于试卷的结束时间,则结束时间为试卷的结束时间)
  176. $endmaketime = strtotime($saveData['startmaketime']) + $paper->duringtime * 60;
  177. $paperEndtime = strtotime($paper->endtime);
  178. if ($endmaketime > $paperEndtime) $endmaketime = $paperEndtime;
  179. $saveData['endmaketime'] = $endmaketime;
  180. } else { // 有答题记录则更改试题答案
  181. // 判断答题时间是否已过
  182. if (time() > $answer->endmaketime) return json(['code' => 1, 'msg' => '答题时间已结束']);
  183. // 判断是否已提交(新兵训练营因为查询时候只查询approve_status==-1,一下条件一直不会经过)
  184. if ($answer->approve_status != -1) return json(['code' => 1, 'msg' => '试卷已提交,无法答题']);
  185. $answerList = json_decode($answer->answer, true);
  186. $answerList[$question->question_id] = $param['answer'];
  187. $saveData['answer'] = json_encode($answerList);
  188. }
  189. $answer->save($saveData);
  190. return json(['code' => 0, 'msg' => '保存成功']);
  191. }
  192. /**
  193. * 答题结束提交
  194. */
  195. public function submitPaper()
  196. {
  197. // 参数:谁,提交试卷
  198. $param = $this->request->only(['paper_id']);
  199. $token = $this->request->token;
  200. $answer = ExamEmpResult::where([
  201. 'employee_id' => $token['employee_id'],
  202. 'paper_id' => $param['paper_id'],
  203. 'root_id' => $token['root_org']
  204. ])->findOrEmpty();
  205. if (empty($answer)) json(['code' => 1, 'msg' => '试卷不存在']);
  206. $paper = ExamPaper::where(['id' => $param['paper_id'], 'root_id' => $token['root_org']])->find();
  207. if (empty($paper)) json(['code' => 1, 'msg' => '试卷不存在']);
  208. // 更新考试时间与状态
  209. $startmaketime = strtotime($answer->startmaketime);
  210. $time_spend = round((time() - $startmaketime) / 60);
  211. // approve_status=0 已提交,未批改; 添加时间实际是提交时间
  212. $answer->save(['time_spend' => $time_spend, 'approve_status' => 0, 'addtime' => date('Y-m-d H:i:s')]);
  213. //系统审核直接批改(改操作会更改批改状态approve_status为2)
  214. if ($paper->checkway == 'sys') {
  215. $this->correct_papers_system($param['paper_id'], $token['employee_id'], $paper->for_newbie);
  216. }
  217. $data = [
  218. 'time_spend' => $time_spend,
  219. 'startmaketime' => $answer->startmaketime,
  220. 'endtime' => $answer->addtime
  221. ];
  222. return json(['code' => 0, 'msg' => '答案提交成功', 'data' => $data]);
  223. }
  224. ////计算判断和简答题的分数
  225. public function score_sum($answer, $paperid, $employee_id, $root_id)
  226. {
  227. $answer = json_decode($answer, true);
  228. $ids = array_keys($answer);
  229. $w[] = ['questions.id', 'in', $ids];
  230. $w[] = ['questions.root_id', '=', $root_id];
  231. $w[] = ['exam_paper_question.root_id', '=', $root_id];
  232. $w[] = ['questions.type', 'not in', ['简答', '问答']];
  233. $w[] = ['exam_paper_question.paper_id', '=', $paperid];
  234. $questions = ExamPaperQuestion::withJoin(['questions'], 'inner')->where($w)
  235. // ->fetchsql()
  236. ->select()
  237. ->toArray();
  238. // var_dump($questions);die;
  239. $score = 0;
  240. foreach ($questions as $k => $v) {
  241. $score += $this->fraction($answer[$v['question_id']], $v['questions']['answer'], $v['questions']['type'], $v['score']);
  242. }
  243. return $score;
  244. }
  245. public function viewresult()
  246. {
  247. $request = request();
  248. $token = $this->request->token;
  249. // $token['result_id'] = 1;
  250. // $token['root_org'] = 23;
  251. $result_id = $request->param('result_id');
  252. $tw[] = ['id', '=', $result_id];
  253. $tw[] = ['from', '=', 0];
  254. $empresult = ExamEmpResult::where($tw)->with(['employee'])->find();
  255. if (!$empresult) {
  256. return json(['code' => 1, 'msg' => '没有参加考试']);
  257. } else {
  258. $emp_answer_arr = [];
  259. $emp_answer_json = $empresult->answer;
  260. if ($emp_answer_json) {
  261. $emp_answer_arr = json_decode($emp_answer_json, true);
  262. }
  263. $paperInfo = ExamPaper::with('questions')->find($empresult->paper_id)->toArray();
  264. $paperInfo['got_total_score'] = 0;
  265. foreach ($paperInfo['questions'] as &$item) {
  266. $item['ask'] = str_replace('\\', '', $item['ask']);
  267. $item['emp_answer'] = isset($emp_answer_arr[$item['id']]) ? $emp_answer_arr[$item['id']] : ''; //填写的答案
  268. if ($item['type'] == '单选' || $item['type'] == '多选' || $item['type'] == '判断') {
  269. if (isset($emp_answer_arr[$item['id']]) && $emp_answer_arr[$item['id']]) {
  270. $item['got_score'] = ($emp_answer_arr[$item['id']] == $item['answer']) ? $item['pivot']['score'] : 0;
  271. } else {
  272. $item['got_score'] = 0;
  273. }
  274. } elseif ($item['type'] == '简答') {
  275. if (isset($emp_answer_arr[$item['id']]) && $emp_answer_arr[$item['id']]) {
  276. $calldata = ExamEmpResult::autoPaperAnswerCheck($emp_answer_arr[$item['id']], $item['answer'], $item['pivot']['score']);
  277. $item['got_score'] = $calldata['got_score'];
  278. } else {
  279. $item['got_score'] = 0;
  280. }
  281. }
  282. $paperInfo['got_total_score'] += $item['got_score']; //得分总和
  283. // $item['content'] = json_decode($item['content'], true);
  284. // $item['answer'] = json_decode($item['answer'], true);
  285. // if (isset($emp_answer_arr[$item['id']])) {
  286. // if ($item['type'] !== '简答') {
  287. // if ($emp_answer_arr[$item['id']] == $item['answer']) {
  288. // $item['got_score'] = $item['pivot']['score'];
  289. // } else {
  290. // $item['got_score'] = 0;
  291. // }
  292. // $paperInfo['got_total_score'] += $item['got_score'];
  293. // $item['emp_answer'] = $emp_answer_arr[$item['id']];
  294. // } else {
  295. // $calldata = ExamEmpResult::autoPaperAnswerCheck($emp_answer_arr[$item['id']],$item['answer'], $item['pivot']['score']);
  296. // $item['got_score'] = $calldata['got_score'];
  297. // $paperInfo['got_total_score'] += $item['got_score'];
  298. // $item['emp_answer'] = $calldata['emp_answer'];
  299. // }
  300. // }
  301. }
  302. return json(['code' => 0, 'info' => $paperInfo, 'msg' => '获取成功']);
  303. }
  304. }
  305. ///批卷部分
  306. public function checklist()
  307. {
  308. $token = $this->request->token;
  309. $request = request();
  310. $param = $request->param();
  311. $where[] = ['state', '=', 1];
  312. $where[] = ['root_id', '=', $token['root_org']];
  313. if (isset($param['paper_id']) && $param['paper_id']) {
  314. $where[] = ['paper_id', '=', $param['paper_id']];
  315. }
  316. if (isset($param['checked']) && $param['checked']) {
  317. $where[] = ['checked', '=', $param['checked']];
  318. }
  319. // $where[] = ['from','=',0];
  320. $list = ExamEmpResult::where($where)->with(['paper', 'employee'])->page($param['page'], $param['limit'])->order('addtime desc')->select();
  321. $count = ExamEmpResult::where($where)->count();
  322. return json(['code' => 0, 'data' => $list, 'count' => $count, 'msg' => '获取成功']);
  323. }
  324. public function makecheck()
  325. {
  326. $request = request();
  327. $param = $request->post();
  328. $updatedata = [
  329. 'check_result' => $param['data'],
  330. 'final_score' => $param['finalscore'],
  331. 'checked' => 1
  332. ];
  333. // $tw[] = ['from','=',0];
  334. $tw[] = ['id', '=', $param['resultid']];
  335. if (ExamEmpResult::where($tw)->update($updatedata)) {
  336. return json(['code' => 0, 'msg' => '审核成功']);
  337. } else {
  338. return json(['code' => 1, 'msg' => '审核失败']);
  339. }
  340. }
  341. // 成绩排行榜
  342. public function ranking()
  343. {
  344. $request = request();
  345. $param = $request->post();
  346. $paperid = input('paperid', 0);
  347. $org = input('org', 0);
  348. $page = input('page', 1);
  349. $limit = input('limit', 10);
  350. $token = $this->request->token;
  351. // $token['org_id'] = 43;
  352. // $token['root_org'] = 23;
  353. // $token['employee_id'] = 58;
  354. $w[] = ['exam_emp_result.root_id', '=', $token['root_org']];
  355. $w[] = ['employee.root_id', '=', $token['root_org']];
  356. $w[] = ['approve_status', '=', 2];
  357. $w[] = ['exam_emp_result.state', '=', 1];
  358. $w[] = ['paper_id', '=', $paperid];
  359. $w[] = ['from', 'in', [0, 1]];
  360. //团队排行
  361. if ($org) {
  362. $w[] = ['employee.org_id', '=', $token['org_id']];
  363. }
  364. $ranking = ExamEmpResult::withJoin(['employee' => []], 'inner')->where($w)->field('final_score,employee_id', false)->order('final_score desc')
  365. // ->fetchsql()
  366. ->select()
  367. ->toArray();
  368. $my['ranking'] = $my['final_score'] = 0;
  369. $my['name'] = $my['headimgurl'] = '';
  370. if ($ranking) {
  371. $eids = array_column($ranking, 'employee_id');
  372. $imgs = Employee::withJoin(['user'], 'inner')->where('employee.root_id', $token['root_org'])->column('employee.name,user.headimgurl', 'employee.id');
  373. foreach ($ranking as $k => &$v) {
  374. if (isset($imgs[$v['employee_id']])) {
  375. $v['name'] = $imgs[$v['employee_id']]['name'];
  376. $v['headimgurl'] = $imgs[$v['employee_id']]['headimgurl'];
  377. } else {
  378. $v['name'] = '';
  379. $v['headimgurl'] = '';
  380. }
  381. $v['ranking'] = $k + 1;
  382. if ($v['employee_id'] == $token['employee_id']) {
  383. $my['ranking'] = $v['ranking'];
  384. $my['name'] = $v['name'];
  385. $my['headimgurl'] = $v['headimgurl'];
  386. $my['final_score'] = $v['final_score'];
  387. }
  388. }
  389. }
  390. $data = array_slice($ranking, ($page - 1) * $limit, $limit);
  391. $count = count($ranking);
  392. $res['data'] = $data;
  393. $res['count'] = $count;
  394. $res['my'] = $my;
  395. return json(['code' => 0, 'data' => $res, 'msg' => '']);
  396. }
  397. // 答题详情
  398. public function get_questions()
  399. {
  400. $token = $this->request->token;
  401. // $token['root_org'] = 23;
  402. $request = request();
  403. $param = $request->post();
  404. $paperid = input('paperid', 0);
  405. $type = input('type', 0);
  406. $employee_id = input('employee_id');
  407. $w[] = ['paper_id', '=', $paperid];
  408. $w[] = ['employee_id', '=', $employee_id];
  409. $w[] = ['root_id', '=', $token['root_org']];
  410. $w[] = ['from', '=', 0];
  411. $empresult = ExamEmpResult::where($w)->with(['employee'])->find();
  412. if (!$empresult) return json(['code' => 1, 'msg' => '没有参加考试']);
  413. $emp_answer_arr = [];
  414. $emp_answer_json = $empresult->answer;
  415. if ($emp_answer_json) {
  416. $emp_answer_arr = json_decode($emp_answer_json, true);
  417. }
  418. $paperInfo = ExamPaper::with('questions')->find($paperid)->toArray();
  419. $paperInfo['got_total_score'] = 0;
  420. $options = [];
  421. $score = $empresult->data ? json_decode($empresult->data, true) : [];
  422. foreach ($paperInfo['questions'] as &$item) {
  423. $item['ask'] = str_replace('\\', '', $item['ask']);
  424. //填写的答案
  425. $item['emp_answer'] = isset($emp_answer_arr[$item['id']]) ? $emp_answer_arr[$item['id']] : '';
  426. $item['emp_answer'] = $item['emp_answer'] ? strip_tags($item['emp_answer']) : '';
  427. if (isset($score[$item['id']])) {
  428. $item['got_score'] = is_array($score[$item['id']]) ? $score[$item['id']]['score'] : $score[$item['id']];
  429. } else {
  430. $item['got_score'] = $this->fraction($item['emp_answer'], $item['answer'], $item['type'], (int)$item['pivot']['score']);
  431. }
  432. //系统评分
  433. //1正确,0错误
  434. $item['c_type'] = $item['got_score'] > 0 ? 1 : 0;
  435. //选择题
  436. if ($item['type'] == '单选' || $item['type'] == '多选') {
  437. $con = json_decode($item['content'], true);
  438. $op = [];
  439. foreach ($con as $v2) {
  440. $op[$v2['title']] = $v2['content'];
  441. }
  442. $item['content'] = $op;
  443. }
  444. //得分总和
  445. $paperInfo['got_total_score'] += (int)$item['got_score'];
  446. if ($type == 0) { //查询全部
  447. $options[] = $item;
  448. } elseif ($type == 1 && $item['c_type'] == 1) { //查询回答正确的题目
  449. $options[] = $item;
  450. } elseif ($type == 2 && $item['c_type'] == 0) { //查询回答错误的题目
  451. $options[] = $item;
  452. }
  453. }
  454. return json(['code' => 0, 'data' => $options, 'msg' => '获取成功']);
  455. }
  456. //获取 答卷列表
  457. public function get_papers()
  458. {
  459. $token = $this->request->token;
  460. // $token['root_org'] = 23;
  461. $paperid = input('paperid', 0);
  462. $type = input('type', 0); //0待阅卷,1阅卷中,2已阅卷
  463. $start = input('start', 0);
  464. $end = input('end', 0);
  465. $page = input('page', 1);
  466. $limit = input('limit', 10);
  467. $w[] = ['root_id', '=', $token['root_org']];
  468. $w[] = ['paper_id', '=', $paperid];
  469. $fen = ExamPaperQuestion::where($w)->sum('score'); //卷面分
  470. if ($type != 3) {
  471. $w[] = ['approve_status', '=', $type];
  472. }
  473. $w[] = ['from', 'in', [0, 1]];
  474. $empresult = ExamEmpResult::with(['employee', 'paperShowRealName'])->where($w)->select()->toArray();
  475. foreach ($empresult as $k => &$v) {
  476. $v['score_sum'] = $fen;
  477. $v['key'] = $k + 1;
  478. }
  479. $res = $empresult;
  480. if ($end > 0) {
  481. $data = [];
  482. foreach ($res as $k => $v) {
  483. if ($v['key'] <= $end && $v['key'] >= $start) {
  484. $data[] = $v;
  485. }
  486. }
  487. $res = $data;
  488. }
  489. $count = count($res);
  490. $data = array_slice($res, ($page - 1) * $limit, $limit);
  491. return json(['code' => 0, 'data' => $data, 'count' => $count, 'msg' => '获取成功']);
  492. }
  493. //批改试卷详情
  494. public function correct_papers_question_list()
  495. {
  496. $token = $this->request->token;
  497. // $token['root_org'] = 23;
  498. $paperid = input('paperid', 0);
  499. $employee_id = input('employee_id');
  500. //是否参加考试
  501. $w[] = ['paper_id', '=', $paperid];
  502. $w[] = ['employee_id', '=', $employee_id];
  503. $w[] = ['root_id', '=', $token['root_org']];
  504. $w[] = ['from', 'in', [0, 1]];
  505. $empresult = ExamEmpResult::where($w)->with(['employee'])->find();
  506. if (!$empresult) return json(['code' => 1, 'msg' => '没有参加考试']);
  507. //批改详情
  508. $correct = $empresult->data ? json_decode($empresult->data, true) : [];
  509. //试卷题目列表
  510. $emp_answer_arr = [];
  511. $emp_answer_json = $empresult->answer;
  512. if ($emp_answer_json) {
  513. $emp_answer_arr = json_decode($emp_answer_json, true);
  514. }
  515. $paperInfo = ExamPaper::with('questions')->find($paperid)->toArray();
  516. $paperInfo['got_total_score'] = 0; //
  517. $options = [];
  518. foreach ($paperInfo['questions'] as &$item) {
  519. $item['ask'] = str_replace('\\', '', $item['ask']);
  520. $item['emp_answer'] = isset($emp_answer_arr[$item['id']]) ? $emp_answer_arr[$item['id']] : ''; //填写的答案
  521. //得分
  522. if ($item['type'] == '单选' || $item['type'] == '多选') {
  523. if (isset($emp_answer_arr[$item['id']]) && $emp_answer_arr[$item['id']]) {
  524. $item['got_score'] = ($emp_answer_arr[$item['id']] == $item['answer']) ? $item['pivot']['score'] : 0;
  525. $item['c_type'] = $item['got_score'] > 0 ? 1 : 0; //1正确,0错误
  526. } else {
  527. $item['got_score'] = 0;
  528. }
  529. $con = json_decode($item['content'], true);
  530. $op = [];
  531. foreach ($con as $v2) {
  532. $op[$v2['title']] = $v2['content'];
  533. }
  534. $item['content'] = $op;
  535. //
  536. } elseif ($item['type'] == '判断') {
  537. if (isset($emp_answer_arr[$item['id']]) && $emp_answer_arr[$item['id']]) {
  538. $item['got_score'] = ($emp_answer_arr[$item['id']] == $item['answer']) ? $item['pivot']['score'] : 0;
  539. $item['c_type'] = $item['got_score'] > 0 ? 1 : 0; //1正确,0错误
  540. } else {
  541. $item['got_score'] = 0;
  542. }
  543. } elseif ($item['type'] == '简答') {
  544. if (isset($emp_answer_arr[$item['id']]) && $emp_answer_arr[$item['id']]) {
  545. $calldata = ExamEmpResult::autoPaperAnswerCheck($emp_answer_arr[$item['id']], $item['answer'], $item['pivot']['score']);
  546. $item['got_score'] = $calldata['got_score'];
  547. } else {
  548. $item['got_score'] = 0;
  549. }
  550. $item['c_type'] = $item['got_score'] > 0 ? 1 : 0; //1正确,0错误
  551. //简单题表字段 内容存的是参考答案 答案字段存的是关键词
  552. $answer = $item['answer'];
  553. $content = $item['content'];
  554. $item['answer'] = $item['content'];
  555. $item['content'] = $item['ask'];
  556. }
  557. $paperInfo['got_total_score'] += $item['got_score']; //得分总和
  558. //是否批改过
  559. $item['is_correct'] = isset($correct[$item['id']]) ? 1 : 0;
  560. //批改分数
  561. $item['correct_score'] = 0;
  562. if (isset($correct[$item['id']])) {
  563. $item['correct_score'] = is_array($correct[$item['id']]) ? $correct[$item['id']]['score'] : $correct[$item['id']];
  564. }
  565. $options[] = $item;
  566. }
  567. return json(['code' => 0, 'data' => $options, 'msg' => '获取成功']);
  568. }
  569. //批改试卷
  570. public function correct_papers()
  571. {
  572. $token = $this->request->token;
  573. // $token['root_org'] = 23;
  574. // $token['employee_id'] = 58;
  575. $id = input('id', 0);
  576. $paperid = input('paperid', 0);
  577. $employee_id = input('employee_id');
  578. $questions_id = input('questions_id', 0);
  579. $score = input('score', 0);
  580. $finish = input('finish', 0);
  581. if ($employee_id == $token['employee_id']) {
  582. return json(['code' => 1, 'msg' => '不能批改自己的试卷']);
  583. }
  584. //是否参加考试
  585. $w[] = ['paper_id', '=', $paperid];
  586. $w[] = ['employee_id', '=', $employee_id];
  587. $w[] = ['root_id', '=', $token['root_org']];
  588. $w[] = ['id', '=', $id];
  589. $empresult = ExamEmpResult::where($w)->with(['employee'])->find();
  590. if ($empresult['approve_status'] == -1) return json(['code' => 1, 'msg' => '考试中,无法批改']);
  591. if (!$empresult) return json(['code' => 1, 'msg' => '没有参加考试,无法批改']);
  592. if ($empresult['state'] == 0) return json(['code' => 1, 'msg' => '答题失效,无法批改']);
  593. if ($empresult['checked'] == 1) return json(['code' => 1, 'msg' => '试卷已审核完成,无法批改']);
  594. if ($empresult['approve_status'] != 0 && $token['employee_id'] != $empresult->aprove_employee_id) {
  595. return json(['code' => 1, 'msg' => '试卷已被其他人批改']);
  596. }
  597. if ($empresult['approve_status'] == 2) {
  598. return json(['code' => 1, 'msg' => '试卷批改完成']);
  599. }
  600. //题目卷面分
  601. $w1[] = ['paper_id', '=', $paperid];
  602. $w1[] = ['root_id', '=', $token['root_org']];
  603. $w1[] = ['question_id', '=', $questions_id];
  604. $j_score = ExamPaperQuestion::where($w1)->value('score');
  605. if (!$j_score) return json(['code' => 1, 'msg' => '题目异常']);
  606. if ($j_score < $score) return json(['code' => 1, 'msg' => '打分不能超过卷面分']);
  607. $data = $empresult->data ? json_decode($empresult->data, true) : [];
  608. $save['id'] = $questions_id;
  609. $save['score'] = $score;
  610. $save['time'] = date('Y-m-d H:i:s');
  611. $data[$questions_id] = $save;
  612. //批改完成计算最终得分
  613. if ($finish == 2) {
  614. $u['final_score'] = array_sum(array_values($data));
  615. }
  616. //确认批改完成
  617. $u['approve_status'] = 2;
  618. $u['data'] = json_encode($data);
  619. $u['aprove_employee_id'] = $token['employee_id'];
  620. ExamEmpResult::where($w)->update($u);
  621. return json(['code' => 0, 'msg' => '批改成功']);
  622. // {"103":{"id":"103","score":"2","time":"2022-02-28 13:50:13"},"106":{"id":"106","score":"2","time":"2022-02-28 13:50:42"}}
  623. }
  624. //批改记录
  625. public function correct_papers_log()
  626. {
  627. $token = $this->request->token;
  628. // $token['root_org'] = 23;
  629. $paperid = input('paperid', 0);
  630. $employee_id = input('employee_id', 0);
  631. //是否参加考试
  632. $w[] = ['paper_id', '=', $paperid];
  633. $w[] = ['employee_id', '=', $employee_id];
  634. $w[] = ['root_id', '=', $token['root_org']];
  635. $w[] = ['from', '=', 0];
  636. $empresult = ExamEmpResult::where($w)->with(['employee'])->find();
  637. if (!$empresult) return json(['code' => 1, 'msg' => '没有参加考试']);
  638. //批改详情
  639. $correct = $empresult->data ? json_decode($empresult->data, true) : [];
  640. $ts = $correct ? array_keys($correct) : [];
  641. //试卷题目列表
  642. $emp_answer_arr = [];
  643. $emp_answer_json = $empresult->answer;
  644. if ($emp_answer_json) {
  645. $emp_answer_arr = json_decode($emp_answer_json, true);
  646. }
  647. $paperInfo = ExamPaper::with('questions')->find($paperid)->toArray();
  648. $paperInfo['got_total_score'] = 0; //
  649. $options = $data = [];
  650. $enames = Employee::with('orgInfo')->where('root_id', $token['root_org'])->select()->toArray();
  651. $ename = [];
  652. foreach ($enames as $k => $v) {
  653. $ename[$v['id']] = !empty($v['name']) && !empty($v['info']) ? $v['name'] . '(' . $v['info'] . ')' : $v['opt_name'].'(运营人员)';
  654. }
  655. foreach ($paperInfo['questions'] as &$item) {
  656. $item['ask'] = str_replace('\\', '', $item['ask']);
  657. $item['emp_answer'] = isset($emp_answer_arr[$item['id']]) ? $emp_answer_arr[$item['id']] : ''; //填写的答案
  658. //得分
  659. if ($item['type'] == '单选' || $item['type'] == '多选') {
  660. if (isset($emp_answer_arr[$item['id']]) && $emp_answer_arr[$item['id']]) {
  661. $item['got_score'] = ($emp_answer_arr[$item['id']] == $item['answer']) ? $item['pivot']['score'] : 0;
  662. $item['c_type'] = $item['got_score'] > 0 ? 1 : 0; //1正确,0错误
  663. } else {
  664. $item['got_score'] = 0;
  665. }
  666. $con = json_decode($item['content'], true);
  667. $op = [];
  668. foreach ($con as $v2) {
  669. $op[$v2['title']] = $v2['content'];
  670. }
  671. $item['content'] = $op;
  672. //
  673. } elseif ($item['type'] == '判断') {
  674. if (isset($emp_answer_arr[$item['id']]) && $emp_answer_arr[$item['id']]) {
  675. $item['got_score'] = ($emp_answer_arr[$item['id']] == $item['answer']) ? $item['pivot']['score'] : 0;
  676. $item['c_type'] = $item['got_score'] > 0 ? 1 : 0; //1正确,0错误
  677. } else {
  678. $item['got_score'] = 0;
  679. }
  680. } elseif ($item['type'] == '简答') {
  681. if (isset($emp_answer_arr[$item['id']]) && $emp_answer_arr[$item['id']]) {
  682. $calldata = ExamEmpResult::autoPaperAnswerCheck($emp_answer_arr[$item['id']], $item['answer'], $item['pivot']['score']);
  683. $item['got_score'] = $calldata['got_score'];
  684. } else {
  685. $item['got_score'] = 0;
  686. }
  687. $item['c_type'] = $item['got_score'] > 0 ? 1 : 0; //1正确,0错误
  688. }
  689. $paperInfo['got_total_score'] += $item['got_score']; //得分总和
  690. //批改分数
  691. $item['is_correct'] = isset($correct[$item['id']]) ? 1 : 0; //是否批改过
  692. $item['correct_score'] = isset($correct[$item['id']]) ? $correct[$item['id']]['score'] : 0;
  693. $item['p_time'] = isset($correct[$item['id']]) ? $correct[$item['id']]['time'] : '';
  694. $item['p_person'] = isset($ename[$empresult->aprove_employee_id]) ? $ename[$empresult->aprove_employee_id] : '';
  695. //批改分数
  696. if ($ts && in_array($item['id'], $ts)) {
  697. $options[] = $item;
  698. }
  699. // $options[] = $item;
  700. }
  701. return json(['code' => 0, 'data' => $options, 'msg' => '获取成功']);
  702. }
  703. /**
  704. * 批改试卷
  705. *
  706. * @return json
  707. */
  708. public function all_correct_papers()
  709. {
  710. $token = $this->request->token;
  711. $paperid = input('paperid', 0);
  712. $employee_id = input('employee_id');
  713. $pigai = input('answer', '');
  714. $result_id = input('result_id', 0);
  715. //权限验证
  716. $paper = ExamPaper::with('questions')->where('id', $paperid)->whereRaw("FIND_IN_SET(" . $token['employee_id'] . " , approve_employee_ids)")->find();
  717. if (!$paper) return json(['code' => 1, 'msg' => '无权限批改']);
  718. if ($paper->checkway == 'sys') return json(['code' => 1, 'msg' => '该试卷由系统批改']);
  719. //是否参加考试
  720. $w[] = ['paper_id', '=', $paperid];
  721. $w[] = ['employee_id', '=', $employee_id];
  722. $w[] = ['root_id', '=', $token['root_org']];
  723. $w[] = ['id', '=', $result_id];
  724. $w[] = ['approve_status', 'in', [0, 1]]; // 只查询考试完毕,未批改的试卷
  725. $empresult = ExamEmpResult::where($w)->with(['employee'])->find();
  726. if (!$empresult) return json(['code' => 1, 'msg' => '未考试或已批改']);
  727. if ($empresult['state'] == 0) return json(['code' => 1, 'msg' => '答题失效,无法批改']);
  728. if ($empresult['approve_status'] == 0 && $empresult->aprove_employee_id != 0 && $token['employee_id'] != $empresult->aprove_employee_id) {
  729. return json(['code' => 1, 'msg' => '试卷已在批改中,请选择其他试卷进行批改']);
  730. }
  731. // 题目卷面分(人工批改)
  732. $json = json_decode($pigai, true);
  733. //考生填写的答案
  734. $jsona = $empresult->answer;
  735. $jsona = json_decode($jsona, true);
  736. // 分数结果
  737. $data = [];
  738. $score = 0;
  739. foreach ($paper->questions as $question) {
  740. $questionScore = 0;
  741. // 系统打分
  742. if (isset($jsona[$question->id]))
  743. $questionScore = $this->fraction($jsona[$question->id], $question->answer, $question->type, (int)$question->pivot->score);
  744. if (isset($json[$question->id])) { // 人工打分
  745. $questionScore = $json[$question->id];
  746. $data[$question->id] = [
  747. 'id' => $question->id,
  748. 'score' => $questionScore,
  749. 'time' => date('Y-m-d H:i:s'),
  750. ];
  751. }
  752. $score += $questionScore;
  753. }
  754. $u['answer'] = json_encode($jsona);
  755. $u['final_score'] = $score;
  756. //确认批改完成
  757. $u['approve_status'] = 2;
  758. $u['data'] = json_encode($data);
  759. $u['aprove_employee_id'] = $token['employee_id'];
  760. $u['aprove_time'] = date('Y-m-d H:i:s');
  761. ExamEmpResult::where($w)->update($u);
  762. //发送消息通知
  763. event(new Msg($employee_id, '您提交的试卷“' . $paper['name'] . '”' . '已批改', 'correctionPaper', $paper['id']));
  764. //下一张,待批改的试卷
  765. $w = [];
  766. $root_id = $token['root_org'];
  767. $w[] = ['exam_emp_result.root_id', '=', $root_id];
  768. $w[] = ['paper.root_id', '=', $root_id];
  769. $w[] = ['exam_emp_result.state', '=', 1];
  770. $w[] = ['exam_emp_result.approve_status', '<>', 2];
  771. $w[] = ['paper.id', '=', $paperid];
  772. $id = ExamEmpResult::withJoin('paper')->where($w)->whereRaw("FIND_IN_SET(" . $token['employee_id'] . " , approve_employee_ids)")->order('exam_emp_result.id asc')->find();
  773. if ($id) {
  774. $id = $id->toArray();
  775. } else {
  776. $id = [];
  777. }
  778. return json(['code' => 0, 'data' => $id, 'msg' => '批改成功']);
  779. }
  780. //计算分数
  781. public function fraction($emp_answer, $answer, $type, $score = 0, $requestid = 0, $questionsid = 0)
  782. {
  783. $emp_score = 0;
  784. if (!$emp_answer) return $emp_score;
  785. if ($type == '判断') {
  786. if (trim($answer) == trim($emp_answer)) {
  787. $emp_score = $score;
  788. }
  789. } elseif ($type == '单选') {
  790. if ($answer == $emp_answer) {
  791. $emp_score = $score;
  792. }
  793. } elseif ($type == '多选') {
  794. $answer = explode(',', $answer);
  795. $emp_answer = explode(',', $emp_answer);
  796. sort($answer);
  797. sort($emp_answer);
  798. if (implode(',', $answer) == implode(',', $emp_answer)) {
  799. $emp_score = $score;
  800. } else {
  801. $danf = $score / count($answer);
  802. $i = 0;
  803. foreach ($emp_answer as $k => $v) {
  804. if (in_array($v, $answer)) {
  805. $i += 1;
  806. }
  807. }
  808. $emp_score = $i * $danf;
  809. }
  810. } elseif ($type == '简答' || $type == '问答') {
  811. $emp_score = $answer = ExamEmpResult::autoPaperAnswerCheck($emp_answer, $answer, $score);
  812. $emp_score = $emp_score['got_score'];
  813. $emp_answer = $answer['emp_answer'];
  814. if ($requestid && $questionsid) {
  815. $tw[] = ['id', '=', $requestid];
  816. $tw[] = ['from', '=', 0];
  817. $json = ExamEmpResult::where($tw)->value('answer');
  818. $json = json_decode($json, true);
  819. if (isset($json[$questionsid])) {
  820. $json[$questionsid] = $emp_answer;
  821. ExamEmpResult::where($tw)->update(['answer' => json_encode($json)]);
  822. }
  823. }
  824. }
  825. return $emp_score;
  826. }
  827. //批改试卷
  828. public function correct_papers_system($paperid, $employee_id, $from = 0)
  829. {
  830. $token = $this->request->token;
  831. // $token['root_org'] = 23;
  832. // $token['employee_id'] = 58;
  833. // $paperid = input('paperid',0);
  834. // $employee_id = input('employee_id',0);
  835. //权限验证
  836. $paper = ExamPaper::where('id', $paperid)->find();
  837. if (!$paper) return json(['code' => 1, 'msg' => '试卷错误']);
  838. if ($paper->checkway == 'employee') return json(['code' => 1, 'msg' => '人工批改试卷,无法系统批改']);
  839. $w = [];
  840. $w[] = ['paper_id', '=', $paperid];
  841. $w[] = ['employee_id', '=', $employee_id];
  842. $w[] = ['root_id', '=', $token['root_org']];
  843. $w[] = ['from', '=', $from];
  844. $empresult = ExamEmpResult::where($w)->with(['employee'])->find();
  845. if (!$empresult) return json(['code' => 1, 'msg' => '没有参加考试']);
  846. // if($empresult->approve_status==2) return json(['code' => 1, 'msg' => '已经批改完成']);
  847. $emp_answer_arr = [];
  848. $emp_answer_json = $empresult->answer;
  849. if ($emp_answer_json) {
  850. $emp_answer_arr = json_decode($emp_answer_json, true);
  851. }
  852. $paperInfo = ExamPaper::with('questions')->find($paperid)->toArray();
  853. $paperInfo['got_total_score'] = 0;
  854. $options = [];
  855. $json = [];
  856. $str = [];
  857. foreach ($paperInfo['questions'] as &$item) {
  858. $item['ask'] = str_replace('\\', '', $item['ask']);
  859. //填写的答案
  860. $item['emp_answer'] = isset($emp_answer_arr[$item['id']]) ? $emp_answer_arr[$item['id']] : '';
  861. //系统评分
  862. $item['got_score'] = $this->fraction($item['emp_answer'], $item['answer'], $item['type'], (int)$item['pivot']['score'], $empresult->id, $item['id']);
  863. $json[$item['id']] = $item['got_score'];
  864. //1正确,0错误
  865. $item['c_type'] = $item['got_score'] > 0 ? 1 : 0;
  866. //选择题
  867. if ($item['type'] == '单选' || $item['type'] == '多选') {
  868. $con = json_decode($item['content'], true);
  869. $op = [];
  870. foreach ($con as $v2) {
  871. $op[$v2['title']] = $v2['content'];
  872. }
  873. $item['content'] = $op;
  874. }
  875. //得分总和
  876. $paperInfo['got_total_score'] += (int)$item['got_score'];
  877. }
  878. $u['final_score'] = $paperInfo['got_total_score'];
  879. $u['approve_status'] = 2;
  880. $u['aprove_time'] = date('Y-m-d H:i:s');
  881. $u['data'] = json_encode($json);
  882. $uw[] = ['id', '=', $empresult->id];
  883. $uw[] = ['from', '=', $from];
  884. ExamEmpResult::where($uw)->update($u);
  885. return json(['code' => 0, 'data' => '批改成功', 'msg' => '批改成功']);
  886. }
  887. //待批改批改试卷
  888. public function treat_correct_papers()
  889. {
  890. $token = $this->request->token;
  891. $page = input('page', 0);
  892. $limit = input('limit', 0);
  893. $root_id = $token['root_org'];
  894. $w[] = ['exam_emp_result.root_id', '=', $root_id];
  895. $w[] = ['paper.root_id', '=', $root_id];
  896. $w[] = ['exam_emp_result.state', '=', 1];
  897. // $w[] = ['exam_emp_result.checked','=',0];
  898. $w[] = ['exam_emp_result.approve_status', '<>', 2];
  899. $w[] = ['exam_emp_result.from', '=', 0];
  900. $w[] = ['exam_emp_result.approve_status.from', '>=', 0];
  901. // $res['data'] = $num;
  902. $paper = ExamEmpResult::withJoin('paper')->with('employee')->where($w)->whereRaw("FIND_IN_SET(" . $token['employee_id'] . " , approve_employee_ids)")->page($page, $limit)
  903. // ->fetchsql()
  904. ->select()
  905. ->toArray();
  906. $count = ExamEmpResult::withJoin('paper')->where($w)->whereRaw("FIND_IN_SET(" . $token['employee_id'] . " , approve_employee_ids)")->count();
  907. $res['data'] = $paper;
  908. $res['count'] = $count;
  909. return json(['code' => 0, 'data' => $res, 'msg' => '']);
  910. }
  911. //待批改批改试卷
  912. public function treat_correct_paper()
  913. {
  914. $token = $this->request->token;
  915. $param = request()->param();
  916. $where[] = ['state', '=', 1];
  917. $where[] = ['root_id', '=', $token['root_org']];
  918. $list = ExamPaper::with(['result'])->where($where)
  919. ->whereRaw("FIND_IN_SET(" . $token['employee_id'] . " , approve_employee_ids)")
  920. ->page($param['page'], $param['limit'])->order('addtime desc')
  921. ->select();
  922. $exam_emp_result = ExamEmpResult::where(['root_id' => $token['root_org']])->group('paper_id')->column('count(paper_id)', 'paper_id');
  923. $paper_employee = Employee::where([['root_id', '=', $token['root_org']], ['uid', '<>', 0], ['state', '=', '在职']])->column('name', 'id');
  924. foreach ($list as $k => &$paper) {
  925. //以阅卷和待阅卷数量
  926. $paper['d_marking'] = $paper['y_marking'] = 0;
  927. foreach ($paper['result'] as $k2 => $v2) {
  928. if ($v2['approve_status'] == -1) continue;
  929. $v2['approve_status'] == 2 ? $paper['y_marking'] += 1 : $paper['d_marking'] += 1;
  930. }
  931. unset($list[$k]['result']);
  932. $time = strtotime($paper->endtime) - time();
  933. $paper['daynum'] = $time > 0 ? $time : 0;
  934. //收到的阅卷数量
  935. $paper['attendee_num'] = isset($exam_emp_result[$paper['id']]) ? $exam_emp_result[$paper['id']] : 0;
  936. //返回考试人员姓名
  937. $arr = [];
  938. foreach ($paper_employee as $key => $val) {
  939. if (in_array($key, explode(',', $paper['assessment']))) {
  940. $arr[] = $val;
  941. }
  942. }
  943. $paper['employee'] = $arr;
  944. }
  945. $count = ExamPaper::where($where)->whereRaw("FIND_IN_SET(" . $token['employee_id'] . " , approve_employee_ids)")
  946. ->count();
  947. return json(['code' => 0, 'data' => $list, 'count' => $count, 'msg' => '获取成功']);
  948. }
  949. }