1
0

Exam.php 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. <?php
  2. namespace app\command;
  3. use app\model\ExamEmpResult;
  4. use app\model\ExamPaper;
  5. use think\console\Command;
  6. use think\console\Input;
  7. use think\console\Output;
  8. use think\facade\Log;
  9. class Exam extends Command
  10. {
  11. protected function configure()
  12. {
  13. $this->setName('exam')
  14. ->setDescription('试卷未完成,到时间自动提交');
  15. }
  16. protected function execute(Input $input, Output $output)
  17. {
  18. Log::close(NULL); // 关闭日志
  19. $output->writeln("自动提交开始处理:" . date('Y-m-d H:i:s'));
  20. // 批改未完成的approve_status=-1,系统批改paper.checkway=sys,考试时间结束的
  21. $now = time();
  22. $data = ExamEmpResult::with('paperInfo')->where([
  23. ['approve_status', '=', -1],
  24. ['endmaketime', '<', $now]
  25. ])->select();
  26. foreach ($data as $item) {
  27. // 如果考试时间结束,则自动提交,更新状态为已提交未批改,考试时间为试卷规定时间
  28. $item->save(['approve_status' => 0, 'time_spend' => round(($item->endmaketime - strtotime($item->startmaketime)) / 60), 'addtime' => date('Y-m-d H:i:s', $now)]);
  29. // 如果试卷不是机器审核的
  30. if ($item->paperInfo->checkway != 'sys') continue;
  31. // 对试卷进行机器审核
  32. $this->correct_papers_system($item);
  33. $output->writeln("处理完成:" . $item->id);
  34. }
  35. $output->writeln("自动提交结束处理: " . date('Y-m-d H:i:s'));
  36. }
  37. /**
  38. * 机器审核试卷
  39. *
  40. * @param [type] $paperid
  41. * @param [type] $employee_id
  42. * @param integer $from
  43. * @return void
  44. */
  45. public function correct_papers_system($result)
  46. {
  47. $emp_answer_arr = json_decode($result->answer, true);
  48. // 查找试题
  49. $paperInfo = ExamPaper::with('questions')->find($result->paper_id);
  50. // 总分
  51. $totalScore = 0;
  52. $json = [];
  53. foreach ($paperInfo->questions as &$item) {
  54. if (!isset($emp_answer_arr[$item->id])) {
  55. $json[$item->id] = 0;
  56. continue;
  57. }
  58. $json[$item->id] = $this->fraction($emp_answer_arr[$item->id], $item['answer'], $item['type'], (int)$item['pivot']['score'], $result->id, $item->id);
  59. //得分总和
  60. $totalScore += (int)$json[$item->id];
  61. }
  62. $u['final_score'] = $totalScore;
  63. $u['approve_status'] = 2;
  64. $u['aprove_time'] = date('Y-m-d H:i:s');
  65. $u['data'] = json_encode($json);
  66. $result->save($u);
  67. }
  68. //计算分数
  69. public function fraction($emp_answer, $answer, $type, $score = 0, $requestid = 0, $questionsid = 0)
  70. {
  71. if (!$emp_answer) return 0;
  72. switch ($type) {
  73. case '判断':
  74. case '单选':
  75. if (trim($answer) == trim($emp_answer)) return $score;
  76. else return 0;
  77. case '多选':
  78. $answer = explode(',', $answer);
  79. $emp_answer = explode(',', $emp_answer);
  80. $rs = array_intersect($answer, $emp_answer);
  81. return $score / count($answer) * count($rs);
  82. case '简答':
  83. case '问答':
  84. $checkedAnswer = ExamEmpResult::autoPaperAnswerCheck($emp_answer, $answer, $score);
  85. if ($requestid && $questionsid) {
  86. $tw[] = ['id', '=', $requestid];
  87. $tw[] = ['from', '=', 0];
  88. $json = ExamEmpResult::where($tw)->value('answer');
  89. $json = json_decode($json, true);
  90. if (isset($json[$questionsid])) {
  91. $json[$questionsid] = $checkedAnswer['emp_answer'];
  92. ExamEmpResult::where($tw)->update(['answer' => json_encode($json)]);
  93. }
  94. }
  95. return $checkedAnswer['got_score'];
  96. }
  97. return 0;
  98. }
  99. }