request->token; $param = request()->param(); $type = input('type', 0); //0全部,1以考试,2未考试 $now = time(); if ($type == 0) { // 查询全部 $where = [ ['state', '=', 1], ['root_id', '=', $token['root_org']], ['for_newbie', '=', 0] // 不包含新兵训练营 ]; $paper_id = ExamPaper::where($where)->whereRaw("FIND_IN_SET(" . $token['employee_id'] . " , assessment)")->order('id desc')->page($param['page'], $param['limit'])->column('id'); $count = ExamPaper::where($where)->whereRaw("FIND_IN_SET(" . $token['employee_id'] . " , assessment)")->count(); } else { $w[] = ['root_id', '=', $token['root_org']]; $w[] = ['employee_id', '=', $token['employee_id']]; $w[] = ['from', '=', 0]; if ($type == 1) { $w[] = ['approve_status', '>=', 0]; } elseif ($type == 3) { $w[] = ['approve_status', '=', -1]; $w[] = ['endmaketime', '>', $now]; } if ($type == 2) { // 查询未参加考试的 $paper_id = ExamEmpResult::where($w)->column('paper_id'); $where = [ ['state', '=', 1], ['root_id', '=', $token['root_org']], ['id', 'not in', $paper_id], ['for_newbie', '=', 0] // 不包含新兵训练营 ]; $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'); $count = ExamPaper::where($where)->count(); } else { // 查询考试中(试卷考试时间未结束)和已考试的 $paper_id = ExamEmpResult::where($w)->order('paper_id desc')->page($param['page'], $param['limit'])->column('paper_id'); $count = ExamEmpResult::where($w)->count(); } } $list = ExamPaper::with(['result' => function ($query) use ($token) { $query->where([['root_id', '=', $token['root_org']], ['employee_id', '=', $token['employee_id']], ['from', '=', 0]]); }])->where([['id', 'in', $paper_id]])->order('addtime desc') ->select(); foreach ($list as $k => &$paper) { if ($paper->result->isEmpty()) { $paper['done'] = 0; } elseif ($paper->result[0]->approve_status < 0 && $paper->result[0]->endmaketime > $now) { $paper['done'] = 2; } else { $paper['done'] = 1; } //以阅卷和待阅卷数量 $paper['d_marking'] = $paper['y_marking'] = 0; foreach ($paper['result'] as $v2) { if ($v2['approve_status'] == -1 && $v2['endmaketime'] > $now) continue; $v2['approve_status'] == 2 ? $paper['y_marking'] += 1 : $paper['d_marking'] += 1; } unset($list[$k]['result']); $time = strtotime($paper->endtime) - $now; $paper['daynum'] = $time > 0 ? $time : 0; } return json(['code' => 0, 'data' => $list, 'count' => $count, 'msg' => '获取成功']); } /** * 考卷详情 */ public function paperdetail() { $request = request(); $token = $this->request->token; $from = input('from', 0); $paperid = $request->param('paperid'); $where[] = ['root_id', '=', $token['root_org']]; $where[] = ['id', '=', $paperid]; $paperInfo = ExamPaper::where($where)->find(); if (empty($paperInfo)) return json(['code' => 1, 'msg' => '试卷不存在']); foreach ($paperInfo->questions as &$v) { $v['ask'] = str_replace('\\', '', $v['ask']); if ($v['type'] == '单选' || $v['type'] == '多选') { $v['types'] = 1; $con = json_decode($v['content'], true); $op = []; foreach ($con as $v2) { $op[$v2['title']] = $v2['content']; } $v['content'] = $op; $v['answer'] = explode(',', $v['answer']); } elseif ($v['type'] == '判断') { $v['types'] = 2; } elseif ($v['type'] == '简答') { $v['types'] = 3; } } $answer_existed = ExamEmpResult::where(['from' => $from, 'employee_id' => $request->param('employee_id'), 'paper_id' => $paperid, 'root_id' => $token['root_org']])->find(); if ($answer_existed) { $paperInfo['done'] = $answer_existed->approve_status == -1 ? 2 : 1; $paperInfo['checked'] = ($answer_existed->checked) ? 1 : 0; $paperInfo['final_score'] = $answer_existed['final_score'] ?: 0; $paperInfo['approve_status'] = $answer_existed->approve_status; $paperInfo['answer'] = json_decode($answer_existed->answer, true); $paperInfo['startmaketime'] = $answer_existed->endmaketime - time(); } else { $paperInfo['done'] = 0; $paperInfo['checked'] = 0; $paperInfo['final_score'] = 0; $paperInfo['approve_status'] = 0; } $paperInfo['is_ok'] = $paperInfo['base_score'] <= $paperInfo['final_score'] && $paperInfo['final_score'] > 0 ? '是' : '否'; //返回指派考试人员名称 $paperInfo['employee'] = Employee::where([['root_id', '=', $token['root_org']], ['uid', '<>', 0], ['state', '=', '在职'], ['id', 'in', explode(',', $paperInfo['assessment'])]])->column('name'); //返回指派考试人员名称 $paperInfo['employee'] = Employee::where([['root_id', '=', $token['root_org']], ['uid', '<>', 0], ['state', '=', '在职'], ['id', 'in', explode(',', $paperInfo['assessment'])]])->column('name'); return json(['code' => 0, 'paperInfo' => $paperInfo, 'msg' => '获取成功']); } /** * 答题存储 */ public function answer() { // 参数:谁,答了哪个试卷的那道题,答案是多少 $param = $this->request->only(['paper_id', 'question', 'answer']); $token = $this->request->token; // 查找试卷是否存在 $paper = ExamPaper::where(['root_id' => $token['root_org'], 'id' => $param['paper_id']])->find(); if (empty($paper)) return json(['code' => 1, 'msg' => '试卷不存在']); if ($paper->endtime < date("Y-m-d H:i:s")) return json(['code' => 1, 'msg' => '答题时间已结束']); if ($param['question'] != 0) { // 查找试题 $question = ExamPaperQuestion::where(['root_id' => $token['root_org'], 'question_id' => $param['question'], 'paper_id' => $param['paper_id']])->find(); if (empty($question)) return json(['code' => 1, 'msg' => '试题不存在']); } // 查找答题记录 $condition = [ 'employee_id' => $token['employee_id'], 'paper_id' => $param['paper_id'], 'root_id' => $token['root_org'], 'from' => $paper->for_newbie ]; // 如果是新兵训练营,可以多次考试 if ($paper->for_newbie == 1) { $condition['approve_status'] = -1; } $answer = ExamEmpResult::where($condition)->findOrEmpty(); if (!$answer->isEmpty() && $param['question'] == 0) return json(['code' => 1, 'msg' => '考试已开始']); $saveData = []; // 判断是否有答题记录 if ($answer->isEmpty()) { // 没有答题记录则添加答题记录 $saveData = [ 'employee_id' => $token['employee_id'], 'paper_id' => $param['paper_id'], 'root_id' => $token['root_org'], 'startmaketime' => date('Y-m-d H:i:s'), 'from' => $paper->for_newbie, 'approve_status' => -1, // 答题中 ]; if ($param['question'] != 0) $saveData['answer'] = json_encode([$question->question_id => $param['answer']]); // 计算考试结束时间(考试的结束时间如果大于试卷的结束时间,则结束时间为试卷的结束时间) $endmaketime = strtotime($saveData['startmaketime']) + $paper->duringtime * 60; $paperEndtime = strtotime($paper->endtime); if ($endmaketime > $paperEndtime) $endmaketime = $paperEndtime; $saveData['endmaketime'] = $endmaketime; } else { // 有答题记录则更改试题答案 // 判断答题时间是否已过 if (time() > $answer->endmaketime) return json(['code' => 1, 'msg' => '答题时间已结束']); // 判断是否已提交(新兵训练营因为查询时候只查询approve_status==-1,一下条件一直不会经过) if ($answer->approve_status != -1) return json(['code' => 1, 'msg' => '试卷已提交,无法答题']); $answerList = json_decode($answer->answer, true); $answerList[$question->question_id] = $param['answer']; $saveData['answer'] = json_encode($answerList); } $answer->save($saveData); return json(['code' => 0, 'msg' => '保存成功']); } /** * 答题结束提交 */ public function submitPaper() { // 参数:谁,提交试卷 $param = $this->request->only(['paper_id']); $token = $this->request->token; $answer = ExamEmpResult::where([ 'employee_id' => $token['employee_id'], 'paper_id' => $param['paper_id'], 'root_id' => $token['root_org'] ])->findOrEmpty(); if (empty($answer)) json(['code' => 1, 'msg' => '试卷不存在']); $paper = ExamPaper::where(['id' => $param['paper_id'], 'root_id' => $token['root_org']])->find(); if (empty($paper)) json(['code' => 1, 'msg' => '试卷不存在']); // 更新考试时间与状态 $startmaketime = strtotime($answer->startmaketime); $time_spend = round((time() - $startmaketime) / 60); // approve_status=0 已提交,未批改; 添加时间实际是提交时间 $answer->save(['time_spend' => $time_spend, 'approve_status' => 0, 'addtime' => date('Y-m-d H:i:s')]); //系统审核直接批改(改操作会更改批改状态approve_status为2) if ($paper->checkway == 'sys') { $this->correct_papers_system($param['paper_id'], $token['employee_id'], $paper->for_newbie); } $data = [ 'time_spend' => $time_spend, 'startmaketime' => $answer->startmaketime, 'endtime' => $answer->addtime ]; return json(['code' => 0, 'msg' => '答案提交成功', 'data' => $data]); } ////计算判断和简答题的分数 public function score_sum($answer, $paperid, $employee_id, $root_id) { $answer = json_decode($answer, true); $ids = array_keys($answer); $w[] = ['questions.id', 'in', $ids]; $w[] = ['questions.root_id', '=', $root_id]; $w[] = ['exam_paper_question.root_id', '=', $root_id]; $w[] = ['questions.type', 'not in', ['简答', '问答']]; $w[] = ['exam_paper_question.paper_id', '=', $paperid]; $questions = ExamPaperQuestion::withJoin(['questions'], 'inner')->where($w) // ->fetchsql() ->select() ->toArray(); // var_dump($questions);die; $score = 0; foreach ($questions as $k => $v) { $score += $this->fraction($answer[$v['question_id']], $v['questions']['answer'], $v['questions']['type'], $v['score']); } return $score; } public function viewresult() { $request = request(); $token = $this->request->token; // $token['result_id'] = 1; // $token['root_org'] = 23; $result_id = $request->param('result_id'); $tw[] = ['id', '=', $result_id]; $tw[] = ['from', '=', 0]; $empresult = ExamEmpResult::where($tw)->with(['employee'])->find(); if (!$empresult) { return json(['code' => 1, 'msg' => '没有参加考试']); } else { $emp_answer_arr = []; $emp_answer_json = $empresult->answer; if ($emp_answer_json) { $emp_answer_arr = json_decode($emp_answer_json, true); } $paperInfo = ExamPaper::with('questions')->find($empresult->paper_id)->toArray(); $paperInfo['got_total_score'] = 0; foreach ($paperInfo['questions'] as &$item) { $item['ask'] = str_replace('\\', '', $item['ask']); $item['emp_answer'] = isset($emp_answer_arr[$item['id']]) ? $emp_answer_arr[$item['id']] : ''; //填写的答案 if ($item['type'] == '单选' || $item['type'] == '多选' || $item['type'] == '判断') { if (isset($emp_answer_arr[$item['id']]) && $emp_answer_arr[$item['id']]) { $item['got_score'] = ($emp_answer_arr[$item['id']] == $item['answer']) ? $item['pivot']['score'] : 0; } else { $item['got_score'] = 0; } } elseif ($item['type'] == '简答') { if (isset($emp_answer_arr[$item['id']]) && $emp_answer_arr[$item['id']]) { $calldata = ExamEmpResult::autoPaperAnswerCheck($emp_answer_arr[$item['id']], $item['answer'], $item['pivot']['score']); $item['got_score'] = $calldata['got_score']; } else { $item['got_score'] = 0; } } $paperInfo['got_total_score'] += $item['got_score']; //得分总和 // $item['content'] = json_decode($item['content'], true); // $item['answer'] = json_decode($item['answer'], true); // if (isset($emp_answer_arr[$item['id']])) { // if ($item['type'] !== '简答') { // if ($emp_answer_arr[$item['id']] == $item['answer']) { // $item['got_score'] = $item['pivot']['score']; // } else { // $item['got_score'] = 0; // } // $paperInfo['got_total_score'] += $item['got_score']; // $item['emp_answer'] = $emp_answer_arr[$item['id']]; // } else { // $calldata = ExamEmpResult::autoPaperAnswerCheck($emp_answer_arr[$item['id']],$item['answer'], $item['pivot']['score']); // $item['got_score'] = $calldata['got_score']; // $paperInfo['got_total_score'] += $item['got_score']; // $item['emp_answer'] = $calldata['emp_answer']; // } // } } return json(['code' => 0, 'info' => $paperInfo, 'msg' => '获取成功']); } } ///批卷部分 public function checklist() { $token = $this->request->token; $request = request(); $param = $request->param(); $where[] = ['state', '=', 1]; $where[] = ['root_id', '=', $token['root_org']]; if (isset($param['paper_id']) && $param['paper_id']) { $where[] = ['paper_id', '=', $param['paper_id']]; } if (isset($param['checked']) && $param['checked']) { $where[] = ['checked', '=', $param['checked']]; } // $where[] = ['from','=',0]; $list = ExamEmpResult::where($where)->with(['paper', 'employee'])->page($param['page'], $param['limit'])->order('addtime desc')->select(); $count = ExamEmpResult::where($where)->count(); return json(['code' => 0, 'data' => $list, 'count' => $count, 'msg' => '获取成功']); } public function makecheck() { $request = request(); $param = $request->post(); $updatedata = [ 'check_result' => $param['data'], 'final_score' => $param['finalscore'], 'checked' => 1 ]; // $tw[] = ['from','=',0]; $tw[] = ['id', '=', $param['resultid']]; if (ExamEmpResult::where($tw)->update($updatedata)) { return json(['code' => 0, 'msg' => '审核成功']); } else { return json(['code' => 1, 'msg' => '审核失败']); } } // 成绩排行榜 public function ranking() { $request = request(); $param = $request->post(); $paperid = input('paperid', 0); $org = input('org', 0); $page = input('page', 1); $limit = input('limit', 10); $token = $this->request->token; // $token['org_id'] = 43; // $token['root_org'] = 23; // $token['employee_id'] = 58; $w[] = ['exam_emp_result.root_id', '=', $token['root_org']]; $w[] = ['employee.root_id', '=', $token['root_org']]; $w[] = ['approve_status', '=', 2]; $w[] = ['exam_emp_result.state', '=', 1]; $w[] = ['paper_id', '=', $paperid]; $w[] = ['from', 'in', [0, 1]]; //团队排行 if ($org) { $w[] = ['employee.org_id', '=', $token['org_id']]; } $ranking = ExamEmpResult::withJoin(['employee' => []], 'inner')->where($w)->field('final_score,employee_id', false)->order('final_score desc') // ->fetchsql() ->select() ->toArray(); $my['ranking'] = $my['final_score'] = 0; $my['name'] = $my['headimgurl'] = ''; if ($ranking) { $eids = array_column($ranking, 'employee_id'); $imgs = Employee::withJoin(['user'], 'inner')->where('employee.root_id', $token['root_org'])->column('employee.name,user.headimgurl', 'employee.id'); foreach ($ranking as $k => &$v) { if (isset($imgs[$v['employee_id']])) { $v['name'] = $imgs[$v['employee_id']]['name']; $v['headimgurl'] = $imgs[$v['employee_id']]['headimgurl']; } else { $v['name'] = ''; $v['headimgurl'] = ''; } $v['ranking'] = $k + 1; if ($v['employee_id'] == $token['employee_id']) { $my['ranking'] = $v['ranking']; $my['name'] = $v['name']; $my['headimgurl'] = $v['headimgurl']; $my['final_score'] = $v['final_score']; } } } $data = array_slice($ranking, ($page - 1) * $limit, $limit); $count = count($ranking); $res['data'] = $data; $res['count'] = $count; $res['my'] = $my; return json(['code' => 0, 'data' => $res, 'msg' => '']); } // 答题详情 public function get_questions() { $token = $this->request->token; // $token['root_org'] = 23; $request = request(); $param = $request->post(); $paperid = input('paperid', 0); $type = input('type', 0); $employee_id = input('employee_id'); $w[] = ['paper_id', '=', $paperid]; $w[] = ['employee_id', '=', $employee_id]; $w[] = ['root_id', '=', $token['root_org']]; $w[] = ['from', '=', 0]; $empresult = ExamEmpResult::where($w)->with(['employee'])->find(); if (!$empresult) return json(['code' => 1, 'msg' => '没有参加考试']); $emp_answer_arr = []; $emp_answer_json = $empresult->answer; if ($emp_answer_json) { $emp_answer_arr = json_decode($emp_answer_json, true); } $paperInfo = ExamPaper::with('questions')->find($paperid)->toArray(); $paperInfo['got_total_score'] = 0; $options = []; $score = $empresult->data ? json_decode($empresult->data, true) : []; foreach ($paperInfo['questions'] as &$item) { $item['ask'] = str_replace('\\', '', $item['ask']); //填写的答案 $item['emp_answer'] = isset($emp_answer_arr[$item['id']]) ? $emp_answer_arr[$item['id']] : ''; $item['emp_answer'] = $item['emp_answer'] ? strip_tags($item['emp_answer']) : ''; if (isset($score[$item['id']])) { $item['got_score'] = is_array($score[$item['id']]) ? $score[$item['id']]['score'] : $score[$item['id']]; } else { $item['got_score'] = $this->fraction($item['emp_answer'], $item['answer'], $item['type'], (int)$item['pivot']['score']); } //系统评分 //1正确,0错误 $item['c_type'] = $item['got_score'] > 0 ? 1 : 0; //选择题 if ($item['type'] == '单选' || $item['type'] == '多选') { $con = json_decode($item['content'], true); $op = []; foreach ($con as $v2) { $op[$v2['title']] = $v2['content']; } $item['content'] = $op; } //得分总和 $paperInfo['got_total_score'] += (int)$item['got_score']; if ($type == 0) { //查询全部 $options[] = $item; } elseif ($type == 1 && $item['c_type'] == 1) { //查询回答正确的题目 $options[] = $item; } elseif ($type == 2 && $item['c_type'] == 0) { //查询回答错误的题目 $options[] = $item; } } return json(['code' => 0, 'data' => $options, 'msg' => '获取成功']); } //获取 答卷列表 public function get_papers() { $token = $this->request->token; // $token['root_org'] = 23; $paperid = input('paperid', 0); $type = input('type', 0); //0待阅卷,1阅卷中,2已阅卷 $start = input('start', 0); $end = input('end', 0); $page = input('page', 1); $limit = input('limit', 10); $w[] = ['root_id', '=', $token['root_org']]; $w[] = ['paper_id', '=', $paperid]; $fen = ExamPaperQuestion::where($w)->sum('score'); //卷面分 if ($type != 3) { $w[] = ['approve_status', '=', $type]; } $w[] = ['from', 'in', [0, 1]]; $empresult = ExamEmpResult::with(['employee', 'paperShowRealName'])->where($w)->select()->toArray(); foreach ($empresult as $k => &$v) { $v['score_sum'] = $fen; $v['key'] = $k + 1; } $res = $empresult; if ($end > 0) { $data = []; foreach ($res as $k => $v) { if ($v['key'] <= $end && $v['key'] >= $start) { $data[] = $v; } } $res = $data; } $count = count($res); $data = array_slice($res, ($page - 1) * $limit, $limit); return json(['code' => 0, 'data' => $data, 'count' => $count, 'msg' => '获取成功']); } //批改试卷详情 public function correct_papers_question_list() { $token = $this->request->token; // $token['root_org'] = 23; $paperid = input('paperid', 0); $employee_id = input('employee_id'); //是否参加考试 $w[] = ['paper_id', '=', $paperid]; $w[] = ['employee_id', '=', $employee_id]; $w[] = ['root_id', '=', $token['root_org']]; $w[] = ['from', 'in', [0, 1]]; $empresult = ExamEmpResult::where($w)->with(['employee'])->find(); if (!$empresult) return json(['code' => 1, 'msg' => '没有参加考试']); //批改详情 $correct = $empresult->data ? json_decode($empresult->data, true) : []; //试卷题目列表 $emp_answer_arr = []; $emp_answer_json = $empresult->answer; if ($emp_answer_json) { $emp_answer_arr = json_decode($emp_answer_json, true); } $paperInfo = ExamPaper::with('questions')->find($paperid)->toArray(); $paperInfo['got_total_score'] = 0; // $options = []; foreach ($paperInfo['questions'] as &$item) { $item['ask'] = str_replace('\\', '', $item['ask']); $item['emp_answer'] = isset($emp_answer_arr[$item['id']]) ? $emp_answer_arr[$item['id']] : ''; //填写的答案 //得分 if ($item['type'] == '单选' || $item['type'] == '多选') { if (isset($emp_answer_arr[$item['id']]) && $emp_answer_arr[$item['id']]) { $item['got_score'] = ($emp_answer_arr[$item['id']] == $item['answer']) ? $item['pivot']['score'] : 0; $item['c_type'] = $item['got_score'] > 0 ? 1 : 0; //1正确,0错误 } else { $item['got_score'] = 0; } $con = json_decode($item['content'], true); $op = []; foreach ($con as $v2) { $op[$v2['title']] = $v2['content']; } $item['content'] = $op; // } elseif ($item['type'] == '判断') { if (isset($emp_answer_arr[$item['id']]) && $emp_answer_arr[$item['id']]) { $item['got_score'] = ($emp_answer_arr[$item['id']] == $item['answer']) ? $item['pivot']['score'] : 0; $item['c_type'] = $item['got_score'] > 0 ? 1 : 0; //1正确,0错误 } else { $item['got_score'] = 0; } } elseif ($item['type'] == '简答') { if (isset($emp_answer_arr[$item['id']]) && $emp_answer_arr[$item['id']]) { $calldata = ExamEmpResult::autoPaperAnswerCheck($emp_answer_arr[$item['id']], $item['answer'], $item['pivot']['score']); $item['got_score'] = $calldata['got_score']; } else { $item['got_score'] = 0; } $item['c_type'] = $item['got_score'] > 0 ? 1 : 0; //1正确,0错误 //简单题表字段 内容存的是参考答案 答案字段存的是关键词 $answer = $item['answer']; $content = $item['content']; $item['answer'] = $item['content']; $item['content'] = $item['ask']; } $paperInfo['got_total_score'] += $item['got_score']; //得分总和 //是否批改过 $item['is_correct'] = isset($correct[$item['id']]) ? 1 : 0; //批改分数 $item['correct_score'] = 0; if (isset($correct[$item['id']])) { $item['correct_score'] = is_array($correct[$item['id']]) ? $correct[$item['id']]['score'] : $correct[$item['id']]; } $options[] = $item; } return json(['code' => 0, 'data' => $options, 'msg' => '获取成功']); } //批改试卷 public function correct_papers() { $token = $this->request->token; // $token['root_org'] = 23; // $token['employee_id'] = 58; $id = input('id', 0); $paperid = input('paperid', 0); $employee_id = input('employee_id'); $questions_id = input('questions_id', 0); $score = input('score', 0); $finish = input('finish', 0); if ($employee_id == $token['employee_id']) { return json(['code' => 1, 'msg' => '不能批改自己的试卷']); } //是否参加考试 $w[] = ['paper_id', '=', $paperid]; $w[] = ['employee_id', '=', $employee_id]; $w[] = ['root_id', '=', $token['root_org']]; $w[] = ['id', '=', $id]; $empresult = ExamEmpResult::where($w)->with(['employee'])->find(); if ($empresult['approve_status'] == -1) return json(['code' => 1, 'msg' => '考试中,无法批改']); if (!$empresult) return json(['code' => 1, 'msg' => '没有参加考试,无法批改']); if ($empresult['state'] == 0) return json(['code' => 1, 'msg' => '答题失效,无法批改']); if ($empresult['checked'] == 1) return json(['code' => 1, 'msg' => '试卷已审核完成,无法批改']); if ($empresult['approve_status'] != 0 && $token['employee_id'] != $empresult->aprove_employee_id) { return json(['code' => 1, 'msg' => '试卷已被其他人批改']); } if ($empresult['approve_status'] == 2) { return json(['code' => 1, 'msg' => '试卷批改完成']); } //题目卷面分 $w1[] = ['paper_id', '=', $paperid]; $w1[] = ['root_id', '=', $token['root_org']]; $w1[] = ['question_id', '=', $questions_id]; $j_score = ExamPaperQuestion::where($w1)->value('score'); if (!$j_score) return json(['code' => 1, 'msg' => '题目异常']); if ($j_score < $score) return json(['code' => 1, 'msg' => '打分不能超过卷面分']); $data = $empresult->data ? json_decode($empresult->data, true) : []; $save['id'] = $questions_id; $save['score'] = $score; $save['time'] = date('Y-m-d H:i:s'); $data[$questions_id] = $save; //批改完成计算最终得分 if ($finish == 2) { $u['final_score'] = array_sum(array_values($data)); } //确认批改完成 $u['approve_status'] = 2; $u['data'] = json_encode($data); $u['aprove_employee_id'] = $token['employee_id']; ExamEmpResult::where($w)->update($u); return json(['code' => 0, 'msg' => '批改成功']); // {"103":{"id":"103","score":"2","time":"2022-02-28 13:50:13"},"106":{"id":"106","score":"2","time":"2022-02-28 13:50:42"}} } //批改记录 public function correct_papers_log() { $token = $this->request->token; // $token['root_org'] = 23; $paperid = input('paperid', 0); $employee_id = input('employee_id', 0); //是否参加考试 $w[] = ['paper_id', '=', $paperid]; $w[] = ['employee_id', '=', $employee_id]; $w[] = ['root_id', '=', $token['root_org']]; $w[] = ['from', '=', 0]; $empresult = ExamEmpResult::where($w)->with(['employee'])->find(); if (!$empresult) return json(['code' => 1, 'msg' => '没有参加考试']); //批改详情 $correct = $empresult->data ? json_decode($empresult->data, true) : []; $ts = $correct ? array_keys($correct) : []; //试卷题目列表 $emp_answer_arr = []; $emp_answer_json = $empresult->answer; if ($emp_answer_json) { $emp_answer_arr = json_decode($emp_answer_json, true); } $paperInfo = ExamPaper::with('questions')->find($paperid)->toArray(); $paperInfo['got_total_score'] = 0; // $options = $data = []; $enames = Employee::with('orgInfo')->where('root_id', $token['root_org'])->select()->toArray(); $ename = []; foreach ($enames as $k => $v) { $ename[$v['id']] = !empty($v['name']) && !empty($v['info']) ? $v['name'] . '(' . $v['info'] . ')' : $v['opt_name'].'(运营人员)'; } foreach ($paperInfo['questions'] as &$item) { $item['ask'] = str_replace('\\', '', $item['ask']); $item['emp_answer'] = isset($emp_answer_arr[$item['id']]) ? $emp_answer_arr[$item['id']] : ''; //填写的答案 //得分 if ($item['type'] == '单选' || $item['type'] == '多选') { if (isset($emp_answer_arr[$item['id']]) && $emp_answer_arr[$item['id']]) { $item['got_score'] = ($emp_answer_arr[$item['id']] == $item['answer']) ? $item['pivot']['score'] : 0; $item['c_type'] = $item['got_score'] > 0 ? 1 : 0; //1正确,0错误 } else { $item['got_score'] = 0; } $con = json_decode($item['content'], true); $op = []; foreach ($con as $v2) { $op[$v2['title']] = $v2['content']; } $item['content'] = $op; // } elseif ($item['type'] == '判断') { if (isset($emp_answer_arr[$item['id']]) && $emp_answer_arr[$item['id']]) { $item['got_score'] = ($emp_answer_arr[$item['id']] == $item['answer']) ? $item['pivot']['score'] : 0; $item['c_type'] = $item['got_score'] > 0 ? 1 : 0; //1正确,0错误 } else { $item['got_score'] = 0; } } elseif ($item['type'] == '简答') { if (isset($emp_answer_arr[$item['id']]) && $emp_answer_arr[$item['id']]) { $calldata = ExamEmpResult::autoPaperAnswerCheck($emp_answer_arr[$item['id']], $item['answer'], $item['pivot']['score']); $item['got_score'] = $calldata['got_score']; } else { $item['got_score'] = 0; } $item['c_type'] = $item['got_score'] > 0 ? 1 : 0; //1正确,0错误 } $paperInfo['got_total_score'] += $item['got_score']; //得分总和 //批改分数 $item['is_correct'] = isset($correct[$item['id']]) ? 1 : 0; //是否批改过 $item['correct_score'] = isset($correct[$item['id']]) ? $correct[$item['id']]['score'] : 0; $item['p_time'] = isset($correct[$item['id']]) ? $correct[$item['id']]['time'] : ''; $item['p_person'] = isset($ename[$empresult->aprove_employee_id]) ? $ename[$empresult->aprove_employee_id] : ''; //批改分数 if ($ts && in_array($item['id'], $ts)) { $options[] = $item; } // $options[] = $item; } return json(['code' => 0, 'data' => $options, 'msg' => '获取成功']); } /** * 批改试卷 * * @return json */ public function all_correct_papers() { $token = $this->request->token; $paperid = input('paperid', 0); $employee_id = input('employee_id'); $pigai = input('answer', ''); $result_id = input('result_id', 0); //权限验证 $paper = ExamPaper::with('questions')->where('id', $paperid)->whereRaw("FIND_IN_SET(" . $token['employee_id'] . " , approve_employee_ids)")->find(); if (!$paper) return json(['code' => 1, 'msg' => '无权限批改']); if ($paper->checkway == 'sys') return json(['code' => 1, 'msg' => '该试卷由系统批改']); //是否参加考试 $w[] = ['paper_id', '=', $paperid]; $w[] = ['employee_id', '=', $employee_id]; $w[] = ['root_id', '=', $token['root_org']]; $w[] = ['id', '=', $result_id]; $w[] = ['approve_status', 'in', [0, 1]]; // 只查询考试完毕,未批改的试卷 $empresult = ExamEmpResult::where($w)->with(['employee'])->find(); if (!$empresult) return json(['code' => 1, 'msg' => '未考试或已批改']); if ($empresult['state'] == 0) return json(['code' => 1, 'msg' => '答题失效,无法批改']); if ($empresult['approve_status'] == 0 && $empresult->aprove_employee_id != 0 && $token['employee_id'] != $empresult->aprove_employee_id) { return json(['code' => 1, 'msg' => '试卷已在批改中,请选择其他试卷进行批改']); } // 题目卷面分(人工批改) $json = json_decode($pigai, true); //考生填写的答案 $jsona = $empresult->answer; $jsona = json_decode($jsona, true); // 分数结果 $data = []; $score = 0; foreach ($paper->questions as $question) { $questionScore = 0; // 系统打分 if (isset($jsona[$question->id])) $questionScore = $this->fraction($jsona[$question->id], $question->answer, $question->type, (int)$question->pivot->score); if (isset($json[$question->id])) { // 人工打分 $questionScore = $json[$question->id]; $data[$question->id] = [ 'id' => $question->id, 'score' => $questionScore, 'time' => date('Y-m-d H:i:s'), ]; } $score += $questionScore; } $u['answer'] = json_encode($jsona); $u['final_score'] = $score; //确认批改完成 $u['approve_status'] = 2; $u['data'] = json_encode($data); $u['aprove_employee_id'] = $token['employee_id']; $u['aprove_time'] = date('Y-m-d H:i:s'); ExamEmpResult::where($w)->update($u); //发送消息通知 event(new Msg($employee_id, '您提交的试卷“' . $paper['name'] . '”' . '已批改', 'correctionPaper', $paper['id'])); //下一张,待批改的试卷 $w = []; $root_id = $token['root_org']; $w[] = ['exam_emp_result.root_id', '=', $root_id]; $w[] = ['paper.root_id', '=', $root_id]; $w[] = ['exam_emp_result.state', '=', 1]; $w[] = ['exam_emp_result.approve_status', '<>', 2]; $w[] = ['paper.id', '=', $paperid]; $id = ExamEmpResult::withJoin('paper')->where($w)->whereRaw("FIND_IN_SET(" . $token['employee_id'] . " , approve_employee_ids)")->order('exam_emp_result.id asc')->find(); if ($id) { $id = $id->toArray(); } else { $id = []; } return json(['code' => 0, 'data' => $id, 'msg' => '批改成功']); } //计算分数 public function fraction($emp_answer, $answer, $type, $score = 0, $requestid = 0, $questionsid = 0) { $emp_score = 0; if (!$emp_answer) return $emp_score; if ($type == '判断') { if (trim($answer) == trim($emp_answer)) { $emp_score = $score; } } elseif ($type == '单选') { if ($answer == $emp_answer) { $emp_score = $score; } } elseif ($type == '多选') { $answer = explode(',', $answer); $emp_answer = explode(',', $emp_answer); sort($answer); sort($emp_answer); if (implode(',', $answer) == implode(',', $emp_answer)) { $emp_score = $score; } else { $danf = $score / count($answer); $i = 0; foreach ($emp_answer as $k => $v) { if (in_array($v, $answer)) { $i += 1; } } $emp_score = $i * $danf; } } elseif ($type == '简答' || $type == '问答') { $emp_score = $answer = ExamEmpResult::autoPaperAnswerCheck($emp_answer, $answer, $score); $emp_score = $emp_score['got_score']; $emp_answer = $answer['emp_answer']; if ($requestid && $questionsid) { $tw[] = ['id', '=', $requestid]; $tw[] = ['from', '=', 0]; $json = ExamEmpResult::where($tw)->value('answer'); $json = json_decode($json, true); if (isset($json[$questionsid])) { $json[$questionsid] = $emp_answer; ExamEmpResult::where($tw)->update(['answer' => json_encode($json)]); } } } return $emp_score; } //批改试卷 public function correct_papers_system($paperid, $employee_id, $from = 0) { $token = $this->request->token; // $token['root_org'] = 23; // $token['employee_id'] = 58; // $paperid = input('paperid',0); // $employee_id = input('employee_id',0); //权限验证 $paper = ExamPaper::where('id', $paperid)->find(); if (!$paper) return json(['code' => 1, 'msg' => '试卷错误']); if ($paper->checkway == 'employee') return json(['code' => 1, 'msg' => '人工批改试卷,无法系统批改']); $w = []; $w[] = ['paper_id', '=', $paperid]; $w[] = ['employee_id', '=', $employee_id]; $w[] = ['root_id', '=', $token['root_org']]; $w[] = ['from', '=', $from]; $empresult = ExamEmpResult::where($w)->with(['employee'])->find(); if (!$empresult) return json(['code' => 1, 'msg' => '没有参加考试']); // if($empresult->approve_status==2) return json(['code' => 1, 'msg' => '已经批改完成']); $emp_answer_arr = []; $emp_answer_json = $empresult->answer; if ($emp_answer_json) { $emp_answer_arr = json_decode($emp_answer_json, true); } $paperInfo = ExamPaper::with('questions')->find($paperid)->toArray(); $paperInfo['got_total_score'] = 0; $options = []; $json = []; $str = []; foreach ($paperInfo['questions'] as &$item) { $item['ask'] = str_replace('\\', '', $item['ask']); //填写的答案 $item['emp_answer'] = isset($emp_answer_arr[$item['id']]) ? $emp_answer_arr[$item['id']] : ''; //系统评分 $item['got_score'] = $this->fraction($item['emp_answer'], $item['answer'], $item['type'], (int)$item['pivot']['score'], $empresult->id, $item['id']); $json[$item['id']] = $item['got_score']; //1正确,0错误 $item['c_type'] = $item['got_score'] > 0 ? 1 : 0; //选择题 if ($item['type'] == '单选' || $item['type'] == '多选') { $con = json_decode($item['content'], true); $op = []; foreach ($con as $v2) { $op[$v2['title']] = $v2['content']; } $item['content'] = $op; } //得分总和 $paperInfo['got_total_score'] += (int)$item['got_score']; } $u['final_score'] = $paperInfo['got_total_score']; $u['approve_status'] = 2; $u['aprove_time'] = date('Y-m-d H:i:s'); $u['data'] = json_encode($json); $uw[] = ['id', '=', $empresult->id]; $uw[] = ['from', '=', $from]; ExamEmpResult::where($uw)->update($u); return json(['code' => 0, 'data' => '批改成功', 'msg' => '批改成功']); } //待批改批改试卷 public function treat_correct_papers() { $token = $this->request->token; $page = input('page', 0); $limit = input('limit', 0); $root_id = $token['root_org']; $w[] = ['exam_emp_result.root_id', '=', $root_id]; $w[] = ['paper.root_id', '=', $root_id]; $w[] = ['exam_emp_result.state', '=', 1]; // $w[] = ['exam_emp_result.checked','=',0]; $w[] = ['exam_emp_result.approve_status', '<>', 2]; $w[] = ['exam_emp_result.from', '=', 0]; $w[] = ['exam_emp_result.approve_status.from', '>=', 0]; // $res['data'] = $num; $paper = ExamEmpResult::withJoin('paper')->with('employee')->where($w)->whereRaw("FIND_IN_SET(" . $token['employee_id'] . " , approve_employee_ids)")->page($page, $limit) // ->fetchsql() ->select() ->toArray(); $count = ExamEmpResult::withJoin('paper')->where($w)->whereRaw("FIND_IN_SET(" . $token['employee_id'] . " , approve_employee_ids)")->count(); $res['data'] = $paper; $res['count'] = $count; return json(['code' => 0, 'data' => $res, 'msg' => '']); } //待批改批改试卷 public function treat_correct_paper() { $token = $this->request->token; $param = request()->param(); $where[] = ['state', '=', 1]; $where[] = ['root_id', '=', $token['root_org']]; $list = ExamPaper::with(['result'])->where($where) ->whereRaw("FIND_IN_SET(" . $token['employee_id'] . " , approve_employee_ids)") ->page($param['page'], $param['limit'])->order('addtime desc') ->select(); $exam_emp_result = ExamEmpResult::where(['root_id' => $token['root_org']])->group('paper_id')->column('count(paper_id)', 'paper_id'); $paper_employee = Employee::where([['root_id', '=', $token['root_org']], ['uid', '<>', 0], ['state', '=', '在职']])->column('name', 'id'); foreach ($list as $k => &$paper) { //以阅卷和待阅卷数量 $paper['d_marking'] = $paper['y_marking'] = 0; foreach ($paper['result'] as $k2 => $v2) { if ($v2['approve_status'] == -1) continue; $v2['approve_status'] == 2 ? $paper['y_marking'] += 1 : $paper['d_marking'] += 1; } unset($list[$k]['result']); $time = strtotime($paper->endtime) - time(); $paper['daynum'] = $time > 0 ? $time : 0; //收到的阅卷数量 $paper['attendee_num'] = isset($exam_emp_result[$paper['id']]) ? $exam_emp_result[$paper['id']] : 0; //返回考试人员姓名 $arr = []; foreach ($paper_employee as $key => $val) { if (in_array($key, explode(',', $paper['assessment']))) { $arr[] = $val; } } $paper['employee'] = $arr; } $count = ExamPaper::where($where)->whereRaw("FIND_IN_SET(" . $token['employee_id'] . " , approve_employee_ids)") ->count(); return json(['code' => 0, 'data' => $list, 'count' => $count, 'msg' => '获取成功']); } }