1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066 |
- <?php
- namespace app\api\controller;
- use app\logics\OrgLogic;
- use app\model\ExamEmpResult;
- use app\model\ExamPaper;
- use app\model\Org;
- use app\model\Employee;
- use app\model\ExamPaperQuestion;
- use app\model\ExamQuestion;
- use app\event\Msg;
- /*
- * 获客工具块
- */
- class Exam extends Base
- {
- /**
- * 考试,试卷列表
- */
- public function paperlist()
- {
- $token = $this->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' => '获取成功']);
- }
- }
|