xiatian před 6 hodinami
rodič
revize
08bba937e8

+ 2 - 0
install/mysql/init/stmms_ft.sql

@@ -257,6 +257,7 @@ CREATE TABLE `eb_exam`
     `re_mark_limit_count` int(11)  DEFAULT NULL  COMMENT '单卷回评次数',
     `barcode_ai_check` tinyint(1)  NOT NULL COMMENT '启用条码粘贴AI检测',
     `answer_ai_check` tinyint(1)  NOT NULL  COMMENT '启用题卡作答AI检测',
+    `ai_check_finish_time`           datetime     DEFAULT NULL COMMENT 'AI检测完成时间',
     PRIMARY KEY (`id`),
     UNIQUE KEY `index1` (`school_id`, `code`)
 ) ENGINE = InnoDB
@@ -367,6 +368,7 @@ CREATE TABLE `eb_exam_student`
     `inspect_tag_user`     int(11)      DEFAULT NULL COMMENT '全卷复核标记人ID',
     `inspect_tag_time`     datetime     DEFAULT NULL COMMENT '全卷复核标记时间',
     `inspect_tag_flagged`  tinyint(1)   DEFAULT NULL COMMENT '全卷复核标记结果',
+    `answer_ai_check_info`  varchar(200)   DEFAULT NULL COMMENT '题卡作答AI检测结果',
     PRIMARY KEY (`id`),
     UNIQUE KEY `index1` (`exam_id`, `exam_number`),
     UNIQUE KEY `index2` (`exam_id`, `secret_number`),

+ 2 - 0
install/mysql/upgrade/2.0.0.sql

@@ -7,6 +7,7 @@ ALTER TABLE eb_exam ADD COLUMN `min_mark_duration` int(11)  DEFAULT NULL  COMMEN
 ALTER TABLE eb_exam ADD COLUMN `re_mark_limit_count` int(11)  DEFAULT NULL  COMMENT '单卷回评次数';
 ALTER TABLE eb_exam ADD COLUMN `barcode_ai_check` tinyint(1)  NOT NULL DEFAULT 0 COMMENT '启用条码粘贴AI检测';
 ALTER TABLE eb_exam ADD COLUMN `answer_ai_check` tinyint(1)  NOT NULL DEFAULT 0 COMMENT '启用题卡作答AI检测';
+ALTER TABLE eb_exam ADD COLUMN `ai_check_finish_time`           datetime     DEFAULT NULL COMMENT 'AI检测完成时间';
 
 
 ALTER TABLE eb_marker ADD COLUMN `wait_arbitrate_count` int(11)     DEFAULT NULL COMMENT '待仲裁数';
@@ -14,6 +15,7 @@ ALTER TABLE eb_marker ADD COLUMN `wait_arbitrate_count` int(11)     DEFAULT NULL
 ALTER TABLE eb_exam_student ADD COLUMN   `inspect_tag_user`     int(11)      DEFAULT NULL COMMENT '全卷复核标记人ID';
 ALTER TABLE eb_exam_student ADD COLUMN   `inspect_tag_time`     datetime     DEFAULT NULL COMMENT '全卷复核标记时间';
 ALTER TABLE eb_exam_student ADD COLUMN   `inspect_tag_flagged`  tinyint(1)   DEFAULT NULL COMMENT '全卷复核标记结果';
+ALTER TABLE eb_exam_student ADD COLUMN   `answer_ai_check_info`  varchar(200)   DEFAULT NULL COMMENT '题卡作答AI检测结果';
 
 DROP TABLE IF EXISTS `m_reject_type`;
 CREATE TABLE `m_reject_type`

+ 53 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/bean/AnswerAiCheckSaveParam.java

@@ -0,0 +1,53 @@
+package cn.com.qmth.stmms.biz.exam.bean;
+
+import java.util.List;
+
+import io.swagger.annotations.ApiModelProperty;
+
+public class AnswerAiCheckSaveParam {
+
+    @ApiModelProperty(value = "考试id")
+    private Integer examId;
+
+    @ApiModelProperty(value = "准考证号")
+    private String examNumber;
+
+    @ApiModelProperty(value = "作答页码")
+    private List<Integer> answerPages;
+
+    @ApiModelProperty(value = "空白页码")
+    private List<Integer> blankPages;
+
+    public Integer getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Integer examId) {
+        this.examId = examId;
+    }
+
+    public String getExamNumber() {
+        return examNumber;
+    }
+
+    public void setExamNumber(String examNumber) {
+        this.examNumber = examNumber;
+    }
+
+    public List<Integer> getAnswerPages() {
+        return answerPages;
+    }
+
+    public void setAnswerPages(List<Integer> answerPages) {
+        this.answerPages = answerPages;
+    }
+
+    public List<Integer> getBlankPages() {
+        return blankPages;
+    }
+
+    public void setBlankPages(List<Integer> blankPages) {
+        this.blankPages = blankPages;
+    }
+
+}

+ 4 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamDao.java

@@ -59,4 +59,8 @@ public interface ExamDao extends PagingAndSortingRepository<Exam, Integer>, JpaS
     @Query("update Exam e set e.updateTime=?2 where e.id=?1")
     public int updateUpdateTime(int examId, Date date);
 
+    @Modifying
+    @Query("update Exam e set e.aiCheckFinishTime=?2 where e.id=?1")
+    public void answerAiCheckFinishTimeSave(Integer examId, Date date);
+
 }

+ 11 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamStudentDao.java

@@ -340,4 +340,15 @@ public interface ExamStudentDao extends JpaRepository<ExamStudent, Integer>, Jpa
     @Modifying
     @Query("update ExamStudent s set s.inspectTagFlagged=?2, s.inspectTagTime=?3 ,s.inspectTagUser=?4 where s.id=?1 ")
     public void inspectTagFlag(Integer studentId, Boolean flag, Date time, Integer userId);
+
+    @Modifying
+    @Query("update ExamStudent s set s.answerAiCheckInfo=?2 where s.id=?1 ")
+    public void answerAiCheckSave(Integer studentId, String string);
+
+    @Modifying
+    @Query("update ExamStudent s set s.answerAiCheckInfo=null where s.id=?1 ")
+    public void answerAiCheckClear(Integer studentId);
+
+    @Query(value = "select s.id from eb_exam_student s where s.exam_id=?1 and s.upload=true and s.absent=false and s.breach=false and s.answer_ai_check_info is null ", nativeQuery = true)
+    public Integer answerAiCheckUnFinish(Integer examId);
 }

+ 12 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/Exam.java

@@ -231,6 +231,10 @@ public class Exam implements Serializable {
     @Column(name = "answer_ai_check", nullable = false)
     private Boolean answerAiCheck;
 
+    // AI检测完成时间
+    @Column(name = "ai_check_finish_time")
+    private Date aiCheckFinishTime;
+
     public Integer getId() {
         return id;
     }
@@ -563,4 +567,12 @@ public class Exam implements Serializable {
         this.answerAiCheck = answerAiCheck;
     }
 
+    public Date getAiCheckFinishTime() {
+        return aiCheckFinishTime;
+    }
+
+    public void setAiCheckFinishTime(Date aiCheckFinishTime) {
+        this.aiCheckFinishTime = aiCheckFinishTime;
+    }
+
 }

+ 13 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ExamStudent.java

@@ -344,6 +344,10 @@ public class ExamStudent implements Serializable {
     @Column(name = "inspect_tag_flagged")
     private Boolean inspectTagFlagged;
 
+    // 题卡作答AI检测结果
+    @Column(name = "answer_ai_check_info")
+    private String answerAiCheckInfo;
+
     /**
      * 科目备注信息
      */
@@ -1031,4 +1035,13 @@ public class ExamStudent implements Serializable {
     public void setCollationLabel(String collationLabel) {
         this.collationLabel = collationLabel;
     }
+
+    public String getAnswerAiCheckInfo() {
+        return answerAiCheckInfo;
+    }
+
+    public void setAnswerAiCheckInfo(String answerAiCheckInfo) {
+        this.answerAiCheckInfo = answerAiCheckInfo;
+    }
+
 }

+ 42 - 40
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/ExamService.java

@@ -1,40 +1,42 @@
-package cn.com.qmth.stmms.biz.exam.service;
-
-import cn.com.qmth.stmms.biz.exam.model.Exam;
-import cn.com.qmth.stmms.biz.exam.query.ExamSearchQuery;
-import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
-import cn.com.qmth.stmms.common.enums.ExamStatus;
-import cn.com.qmth.stmms.common.enums.ExamType;
-import cn.com.qmth.stmms.common.enums.ObjectiveStatus;
-
-import java.util.Date;
-import java.util.List;
-
-public interface ExamService {
-
-    Exam save(Exam exam);
-
-    Exam findById(Integer id);
-
-    void updateSliceConfig(Integer id, List<PictureConfigItem> configList);
-
-    ExamSearchQuery findByQuery(ExamSearchQuery query);
-
-    List<Exam> findBySchoolIdAndTypeAndStatus(Integer schoolId, ExamType type);
-
-    List<Exam> findBySchoolId(Integer schoolId);
-
-    Exam findBySchoolAndCode(Integer schoolId, String code);
-
-    List<Exam> findByMarkerUserId(Integer userId, Date time);
-
-    List<Exam> findBySubjectHeaderUserId(Integer schoolId, Integer userId);
-
-    int updateObjectiveStatus(int examId, ObjectiveStatus calculate);
-
-    void updateStatus(Integer id, ExamStatus status);
-
-    List<Exam> findBySchoolViewUserId(Integer schoolId, Integer userId);
-
-    int updateExamUpdateTime(int examId);
-}
+package cn.com.qmth.stmms.biz.exam.service;
+
+import cn.com.qmth.stmms.biz.exam.model.Exam;
+import cn.com.qmth.stmms.biz.exam.query.ExamSearchQuery;
+import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
+import cn.com.qmth.stmms.common.enums.ExamStatus;
+import cn.com.qmth.stmms.common.enums.ExamType;
+import cn.com.qmth.stmms.common.enums.ObjectiveStatus;
+
+import java.util.Date;
+import java.util.List;
+
+public interface ExamService {
+
+    Exam save(Exam exam);
+
+    Exam findById(Integer id);
+
+    void updateSliceConfig(Integer id, List<PictureConfigItem> configList);
+
+    ExamSearchQuery findByQuery(ExamSearchQuery query);
+
+    List<Exam> findBySchoolIdAndTypeAndStatus(Integer schoolId, ExamType type);
+
+    List<Exam> findBySchoolId(Integer schoolId);
+
+    Exam findBySchoolAndCode(Integer schoolId, String code);
+
+    List<Exam> findByMarkerUserId(Integer userId, Date time);
+
+    List<Exam> findBySubjectHeaderUserId(Integer schoolId, Integer userId);
+
+    int updateObjectiveStatus(int examId, ObjectiveStatus calculate);
+
+    void updateStatus(Integer id, ExamStatus status);
+
+    List<Exam> findBySchoolViewUserId(Integer schoolId, Integer userId);
+
+    int updateExamUpdateTime(int examId);
+
+    void answerAiCheckFinishTimeSave(Integer examId, Long finishTime);
+}

+ 7 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/ExamStudentService.java

@@ -5,6 +5,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import cn.com.qmth.stmms.biz.exam.bean.AnswerAiCheckSaveParam;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
@@ -244,4 +245,10 @@ public interface ExamStudentService {
     public void inspectTagFlag(Integer studentId, Boolean flag, Integer userId);
 
     void inspectTagClear(Integer studentId);
+
+    public void answerAiCheckSave(AnswerAiCheckSaveParam req);
+
+    void answerAiCheckClear(Integer studentId);
+
+    Boolean answerAiCheckFinish(Integer examId);
 }

+ 6 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ExamServiceImpl.java

@@ -164,4 +164,10 @@ public class ExamServiceImpl extends BaseQueryService<Exam> implements ExamServi
         return examDao.updateUpdateTime(examId, new Date());
     }
 
+    @Transactional
+    @Override
+    public void answerAiCheckFinishTimeSave(Integer examId, Long finishTime) {
+        examDao.answerAiCheckFinishTimeSave(examId, new Date(finishTime));
+    }
+
 }

+ 39 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ExamStudentServiceImpl.java

@@ -37,6 +37,7 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
 import cn.com.qmth.stmms.biz.common.BaseQueryService;
+import cn.com.qmth.stmms.biz.exam.bean.AnswerAiCheckSaveParam;
 import cn.com.qmth.stmms.biz.exam.dao.ExamStudentDao;
 import cn.com.qmth.stmms.biz.exam.model.AnswerCard;
 import cn.com.qmth.stmms.biz.exam.model.Exam;
@@ -73,6 +74,7 @@ import cn.com.qmth.stmms.biz.utils.PictureTag;
 import cn.com.qmth.stmms.biz.utils.ScoreItem;
 import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.enums.SubjectiveStatus;
+import net.sf.json.JSONObject;
 
 @Service
 public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implements ExamStudentService {
@@ -1802,4 +1804,41 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
     public void inspectTagClear(Integer studentId) {
         studentDao.inspectTagClear(studentId);
     }
+
+    @Transactional
+    @Override
+    public void answerAiCheckSave(AnswerAiCheckSaveParam req) {
+        if (req.getExamId() == null) {
+            throw new StatusException("examId不能为空");
+        }
+        if (StringUtils.isBlank(req.getExamNumber())) {
+            throw new StatusException("ExamNumber不能为空");
+        }
+        ExamStudent es = findByExamIdAndExamNumber(req.getExamId(), req.getExamNumber());
+        if (es == null) {
+            throw new StatusException("未找到考生");
+        }
+        JSONObject js = new JSONObject();
+        js.put("answerPages", req.getAnswerPages());
+        js.put("blankPages", req.getBlankPages());
+        studentDao.answerAiCheckSave(es.getId(), js.toString());
+    }
+
+    @Transactional
+    @Override
+    public void answerAiCheckClear(Integer studentId) {
+        if (studentId == null) {
+            throw new StatusException("studentId不能为空");
+        }
+        studentDao.answerAiCheckClear(studentId);
+    }
+
+    @Override
+    public Boolean answerAiCheckFinish(Integer examId) {
+        if (examId == null) {
+            throw new StatusException("examId不能为空");
+        }
+        Integer sid = studentDao.answerAiCheckUnFinish(examId);
+        return sid == null;
+    }
 }

+ 49 - 6
stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/admin/ExamController.java

@@ -1,10 +1,12 @@
 package cn.com.qmth.stmms.api.controller.admin;
 
 import java.math.BigDecimal;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
 
-import cn.com.qmth.stmms.admin.utils.SessionExamUtils;
-import cn.com.qmth.stmms.common.utils.RequestUtils;
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -46,8 +48,6 @@ import net.sf.json.JSONArray;
 import net.sf.json.JSONObject;
 import net.sf.json.JsonConfig;
 
-import javax.servlet.http.HttpServletRequest;
-
 @Api(tags = "考试管理")
 @Controller("adminExamController")
 @RequestMapping("/api/admin/exam")
@@ -73,6 +73,49 @@ public class ExamController extends BaseApiController {
     @Autowired
     private ExamService examService;
 
+    @ApiOperation(value = "保存考试ai检测预估时间")
+    @ResponseBody
+    @RequestMapping(value = "answer-ai-check/finish-time", method = RequestMethod.POST)
+    public ResultMessage answerAiCheckFinishTime(@RequestParam Integer examId, @RequestParam Long finishTime) {
+        examService.answerAiCheckFinishTimeSave(examId, finishTime);
+        return resultOk();
+    }
+
+    @ApiOperation(value = "获取考试ai检测预估时间")
+    @ResponseBody
+    @RequestMapping(value = "answer-ai-check/finish-time/info", method = RequestMethod.POST)
+    public String answerAiCheckFinishTimeInfo(@RequestParam Integer examId) {
+        Boolean finish = examStudentService.answerAiCheckFinish(examId);
+        if (finish) {
+            return "AI检测已完成";
+        } else {
+            Exam exam = examService.findById(examId);
+            Long now = System.currentTimeMillis();
+            if (exam.getAiCheckFinishTime() == null) {
+                return "AI检测预计耗时预估中";
+            } else {
+                if (now >= exam.getAiCheckFinishTime().getTime()) {
+                    return "AI检测预计耗时1分钟后完成";
+                } else {
+                    long time = exam.getAiCheckFinishTime().getTime() - now;
+                    return "AI检测预计耗时" + getText(time) + "后完成";
+                }
+            }
+        }
+    }
+
+    private String getText(long millis) {
+        long totalSeconds = millis / 1000;
+        long hours = totalSeconds / 3600;
+        // 计算剩余秒数
+        long remainingSecondsAfterHours = totalSeconds % 3600;
+        // 计算分钟数
+        long minutes = remainingSecondsAfterHours / 60;
+        // 计算剩余秒数
+        // int seconds = remainingSecondsAfterHours % 60;
+
+        return String.format("%d小时%d分钟", hours, minutes);
+    }
     // @Autowired
     // private SchoolService schoolService;
 
@@ -273,7 +316,7 @@ public class ExamController extends BaseApiController {
             examList = examService.findBySchoolId(wu.getUser().getSchoolId());
         }
         List<ExamVo> ret = new ArrayList<>();
-        for (Exam e : query.getResult()) {
+        for (Exam e : examList) {
             ret.add(ExamVo.of(e));
         }
         return ret;

+ 26 - 10
stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/admin/StudentController.java

@@ -10,9 +10,6 @@ import java.util.stream.Collectors;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import cn.com.qmth.stmms.biz.exam.bean.ResultMessage;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -33,13 +30,23 @@ import cn.com.qmth.stmms.admin.vo.CollationLabelVO;
 import cn.com.qmth.stmms.admin.vo.ExamStudentVO;
 import cn.com.qmth.stmms.admin.vo.UploadStudentVO;
 import cn.com.qmth.stmms.api.controller.BaseApiController;
-import cn.com.qmth.stmms.biz.config.service.impl.SystemCache;
-import cn.com.qmth.stmms.biz.exam.model.*;
+import cn.com.qmth.stmms.biz.exam.bean.AnswerAiCheckSaveParam;
+import cn.com.qmth.stmms.biz.exam.bean.ResultMessage;
+import cn.com.qmth.stmms.biz.exam.model.CollationLabel;
+import cn.com.qmth.stmms.biz.exam.model.Exam;
+import cn.com.qmth.stmms.biz.exam.model.ExamPackage;
+import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
+import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
+import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
-import cn.com.qmth.stmms.biz.exam.service.*;
+import cn.com.qmth.stmms.biz.exam.service.CollationLabelService;
+import cn.com.qmth.stmms.biz.exam.service.ExamPackageService;
+import cn.com.qmth.stmms.biz.exam.service.ExamService;
+import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
+import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
+import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
 import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.biz.mark.service.MarkService;
-import cn.com.qmth.stmms.biz.user.model.User;
 import cn.com.qmth.stmms.biz.utils.PageUtil;
 import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.enums.ExamType;
@@ -49,6 +56,8 @@ import cn.com.qmth.stmms.common.enums.SubjectiveStatus;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
 import cn.com.qmth.stmms.common.utils.ImportExcel;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
 import net.sf.json.JSONObject;
 
 @Api(tags = "考生管理")
@@ -86,13 +95,20 @@ public class StudentController extends BaseApiController {
 
     private static final String PAPER_TYPES_REGEX = "[a-zA-Z#]";
 
+    @ApiOperation(value = "题卡ai检测结果保存")
+    @RequestMapping(value = "answer-ai-check/save", method = RequestMethod.POST)
+    @ResponseBody
+    public String answerAiCheckSave(AnswerAiCheckSaveParam req) {
+        studentService.answerAiCheckSave(req);
+        return req.getExamNumber();
+    }
+
     @ApiOperation(value = "查询考生")
     @RequestMapping(value = "/list", method = RequestMethod.POST)
     @ResponseBody
     @Logging(menu = "查询考生", type = LogType.QUERY)
     public PageResult<ExamStudent> list(HttpServletRequest request, ExamStudentSearchQuery query) {
         int examId = getSessionExamId(request);
-        User user = RequestUtils.getApiUser(request).getUser();
         List<CollationLabel> collationLabel = collationLabelService.list(examId);
         Map<String, CollationLabel> collationLabelMap = collationLabel.stream()
                 .collect(Collectors.toMap(CollationLabel::getCode, Function.identity()));
@@ -194,13 +210,13 @@ public class StudentController extends BaseApiController {
         }
         return resultOk();
     }
+
     @ApiOperation(value = "修改考生")
     @RequestMapping(value = "/update", method = RequestMethod.POST)
     @ResponseBody
     @Logging(menu = "修改考生", type = LogType.UPDATE)
     public ResultMessage update(HttpServletRequest request, ExamStudent student) {
         int examId = getSessionExamId(request);
-        Exam exam = examService.findById(examId);
         ExamSubject subject = subjectService.find(examId, student.getSubjectCode());
         if (subject == null) {
             throw new StatusException("科目不存在");
@@ -518,7 +534,7 @@ public class StudentController extends BaseApiController {
                 groupService.updateStatus(student.getExamId(), student.getSubjectCode(), markGroup.getNumber(),
                         MarkStatus.FORMAL, MarkStatus.FINISH);
             }
-            return  resultOk();
+            return resultOk();
         } else {
             throw new StatusException("将违纪考生信息重置为正常时出错!");
         }

+ 5 - 8
stmms-web/src/main/java/cn/com/qmth/stmms/common/controller/BaseController.java

@@ -335,6 +335,7 @@ public class BaseController {
                 groupService.updateStatus(student.getExamId(), student.getSubjectCode(), markGroup.getNumber(),
                         MarkStatus.FORMAL, MarkStatus.FINISH);
             }
+            studentService.answerAiCheckClear(student.getId());
         }
         calculateObjectiveScore(student);
         if (student.isAbsent()) {// 转缺考
@@ -351,11 +352,8 @@ public class BaseController {
         }
         boolean success = studentService.updateScanInfo(student);
         if (success) {
-            subjectService.updateUploadCount(
-                    student.getExamId(),
-                    student.getSubjectCode(),
-                    (int) studentService.countUploadedByExamIdAndSubjectCode(student.getExamId(),
-                            student.getSubjectCode()));
+            subjectService.updateUploadCount(student.getExamId(), student.getSubjectCode(), (int) studentService
+                    .countUploadedByExamIdAndSubjectCode(student.getExamId(), student.getSubjectCode()));
         }
         return success;
     }
@@ -363,9 +361,8 @@ public class BaseController {
     private void calculateObjectiveScore(ExamStudent student) {
         ScoreCalculateUtil util = ScoreCalculateUtil.instance(student);
 
-        ScoreInfo info = util.calculate(
-                questionService.findByExamAndSubjectAndObjectiveAndPaperType(student.getExamId(),
-                        student.getSubjectCode(), true, student.getPaperType()), null);
+        ScoreInfo info = util.calculate(questionService.findByExamAndSubjectAndObjectiveAndPaperType(
+                student.getExamId(), student.getSubjectCode(), true, student.getPaperType()), null);
 
         student.setObjectiveScore(info.getObjectiveScore());
         student.setScoreList(info.getScoreList(), true);