Browse Source

bug修改

wangliang 4 năm trước cách đây
mục cha
commit
23fb042788

+ 1 - 10
themis-business/src/main/java/com/qmth/themis/business/dao/TOeExamRecordMapper.java

@@ -294,16 +294,7 @@ public interface TOeExamRecordMapper extends BaseMapper<TOeExamRecord> {
      */
     public List<InvigilateListPatrolReportBean> patrolReport(@Param("examId") Long examId, @Param("userId") Long userId);
 
-    /**
-     * 考情监考报表接口
-     *
-     * @param examId
-     * @param userId
-     * @return
-     */
-    public List<InvigilateListPatrolReportBean> examInvigilateReport(@Param("examId") Long examId, @Param("userId") Long userId);
-
-    public TOeExamRecord findOneByExamId(@Param("examId") Long examId);
+    public TOeExamRecord findOneByExamId(@Param("examId") Long examId,@Param("status") String status);
 
     public Long getExamingCount();
 

+ 8 - 7
themis-business/src/main/java/com/qmth/themis/business/service/TOeExamRecordService.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.qmth.themis.business.bean.backend.*;
 import com.qmth.themis.business.entity.TOeExamRecord;
+import com.qmth.themis.business.enums.ExamRecordStatusEnum;
 import com.qmth.themis.business.enums.ExamTypeEnum;
 import com.qmth.themis.business.enums.LivenessTypeEnum;
 import com.qmth.themis.business.enums.VerifyExceptionEnum;
@@ -283,12 +284,12 @@ public interface TOeExamRecordService extends IService<TOeExamRecord> {
      * @return
      */
     public List<InvigilateListProgressExcelBean> invigilatePageProgressListExport(Long examId,
-                                                                        Long examActivityId,
-                                                                        String roomCode,
-                                                                        String courseCode,
-                                                                        String name,
-                                                                        String identity,
-                                                                        Long userId);
+                                                                                  Long examActivityId,
+                                                                                  String roomCode,
+                                                                                  String courseCode,
+                                                                                  String name,
+                                                                                  String identity,
+                                                                                  Long userId);
 
     /**
      * 监考明细管理列表
@@ -358,5 +359,5 @@ public interface TOeExamRecordService extends IService<TOeExamRecord> {
 
     TOeExamRecord findOneByPaperId(Long paperId);
 
-    TOeExamRecord findOneByExamId(Long examId);
+    TOeExamRecord findOneByExamId(Long examId, ExamRecordStatusEnum status);
 }

+ 10 - 9
themis-business/src/main/java/com/qmth/themis/business/service/impl/TOeExamRecordServiceImpl.java

@@ -212,9 +212,9 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
             }
         }
 
-        if(answer.getScore()==null) {
-        	log.debug("小题分数为空,得分置为0,"+"recordId:"+recordId+" questionKey:"+key);
-        	answer.setScore(0.0);
+        if (answer.getScore() == null) {
+            log.debug("小题分数为空,得分置为0," + "recordId:" + recordId + " questionKey:" + key);
+            answer.setScore(0.0);
         }
         // 更新分数
         redisUtil.set(RedisKeyHelper.examAnswerKey(recordId),
@@ -255,8 +255,8 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
 
     private boolean checkSingleChoice(String answerArray, JSONArray ar) {
         JSONArray an = JSONArray.parseArray(answerArray);
-        if(an.size()==0) {
-        	return false;
+        if (an.size() == 0) {
+            return false;
         }
         int a = an.getIntValue(0);
         return checkSingleChoice(a, ar);
@@ -311,13 +311,13 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
             dfile.mkdirs();
             String structFilePath = sdf.format(new Date()) + "/" + uuid() + ".json";
             ExamStudentPaperStructCacheBean struct = (ExamStudentPaperStructCacheBean) redisUtil.get(RedisKeyHelper.studentPaperStructKey(recordId));
-            
+
             //保存考试记录
             Map<String, Object> record = redisUtil.getHashEntries(RedisKeyHelper.examRecordCacheKey(recordId));
             TOeExamRecord er = SimpleBeanUtil.mapToObject(record, TOeExamRecord.class);
             er.setStatus(ExamRecordStatusEnum.PERSISTED);
             if (struct != null) {
-            	er.setPaperStructPath(structFilePath);
+                er.setPaperStructPath(structFilePath);
             }
             er.setPaperStructUpload(1);
             saveOrUpdate(er);
@@ -411,6 +411,7 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
 
     /**
      * 多字段更新
+     *
      * @param recordId
      * @param colNames
      * @param colValues
@@ -760,7 +761,7 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
     }
 
     @Override
-    public TOeExamRecord findOneByExamId(Long examId) {
-        return tOeExamRecordMapper.findOneByExamId(examId);
+    public TOeExamRecord findOneByExamId(Long examId, ExamRecordStatusEnum status) {
+        return tOeExamRecordMapper.findOneByExamId(examId, status.name());
     }
 }

+ 10 - 2
themis-business/src/main/resources/mapper/TOeExamRecordMapper.xml

@@ -524,9 +524,17 @@
 		select count(1) from t_oe_exam_record f
 		where f.exam_id = #{examId}
 	</select>
-	<select id="findOneByExamId" resultType="java.lang.Long">
+
+	<select id="findOneByExamId" resultType="com.qmth.themis.business.entity.TOeExamRecord">
 		select f.* from t_oe_exam_record f
-		where f.exam_id = #{examId}
+		<where>
+			<if test="examId != null and examId != ''">
+				and f.exam_id = #{examId}
+			</if>
+			<if test="status != null and status != ''">
+				and f.status = #{status}
+			</if>
+		</where>
 		limit 1
 	</select>
 

+ 52 - 14
themis-task/src/main/java/com/qmth/themis/task/quartz/service/impl/QuartzLogicServiceImpl.java

@@ -3,13 +3,17 @@ package com.qmth.themis.task.quartz.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.qmth.themis.business.cache.ExamRecordCacheUtil;
 import com.qmth.themis.business.cache.RedisKeyHelper;
+import com.qmth.themis.business.cache.bean.ExamCacheBean;
 import com.qmth.themis.business.cache.bean.ExamStudentCacheBean;
 import com.qmth.themis.business.entity.TEExamActivity;
+import com.qmth.themis.business.entity.TOeExamRecord;
 import com.qmth.themis.business.enums.ExamRecordStatusEnum;
 import com.qmth.themis.business.enums.FinishTypeEnum;
 import com.qmth.themis.business.service.TEExamActivityService;
 import com.qmth.themis.business.service.TEExamService;
 import com.qmth.themis.business.service.TEExamStudentService;
+import com.qmth.themis.business.service.TOeExamRecordService;
+import com.qmth.themis.business.threadPool.MyThreadPool;
 import com.qmth.themis.business.util.RedisUtil;
 import com.qmth.themis.task.quartz.service.QuartzLogicService;
 import org.slf4j.Logger;
@@ -44,6 +48,9 @@ public class QuartzLogicServiceImpl implements QuartzLogicService {
     @Resource
     TEExamStudentService teExamStudentService;
 
+    @Resource
+    TOeExamRecordService tOeExamRecordService;
+
     /**
      * 考试场次quartz逻辑
      *
@@ -57,21 +64,52 @@ public class QuartzLogicServiceImpl implements QuartzLogicService {
         QueryWrapper<TEExamActivity> teExamActivityQueryWrapper = new QueryWrapper<>();
         teExamActivityQueryWrapper.lambda().eq(TEExamActivity::getCode, strings[1]);
         TEExamActivity teExamActivity = teExamActivityService.getOne(teExamActivityQueryWrapper);
-        if (Objects.nonNull(teExamActivity) && teExamActivity.getEnable() == 1) {
-            Map<String, Object> objectMap = redisUtil.getHashEntries(RedisKeyHelper.examActivityRecordCacheKey(teExamActivity.getId()));
-            if (Objects.nonNull(objectMap) && objectMap.size() > 0) {
-                objectMap.forEach((k, v) -> {
-                    ExamRecordStatusEnum examRecordStatusEnum = (ExamRecordStatusEnum) v;
-                    //获取该考试批次下所有未交卷的考生的考试记录
-                    if (Objects.nonNull(examRecordStatusEnum) && !Objects.equals(ExamRecordStatusEnum.FINISHED, examRecordStatusEnum)) {
-                        Long recordId = Long.parseLong(k);
-                        Integer durationSeconds = ExamRecordCacheUtil.getDurationSeconds(recordId);
-                        Long examStudentId = ExamRecordCacheUtil.getExamStudentId(recordId);
-                        ExamStudentCacheBean examStudentCacheBean = teExamStudentService.getExamStudentCacheBean(examStudentId);
-                        //交卷
-                        teExamService.finish(examStudentCacheBean.getStudentId(), Long.parseLong(k), FinishTypeEnum.AUTO.name(), durationSeconds);
+        ExamCacheBean examCacheBean = teExamService.getExamCacheBean(teExamActivity.getExamId());
+        if (Objects.nonNull(examCacheBean) && examCacheBean.getEnable() == 1 && Objects.nonNull(teExamActivity) && teExamActivity.getEnable() == 1) {
+            Integer forceFinish = examCacheBean.getForceFinish();
+            if (Objects.nonNull(forceFinish) && forceFinish.intValue() == 1) {//强制收卷
+                Map<String, Object> objectMap = redisUtil.getHashEntries(RedisKeyHelper.examActivityRecordCacheKey(teExamActivity.getId()));
+                if (Objects.nonNull(objectMap) && objectMap.size() > 0) {
+                    objectMap.forEach((k, v) -> {
+                        ExamRecordStatusEnum examRecordStatusEnum = (ExamRecordStatusEnum) v;
+                        //获取该考试批次下所有未交卷的考生的考试记录
+                        if (Objects.nonNull(examRecordStatusEnum) && !Objects.equals(ExamRecordStatusEnum.FINISHED, examRecordStatusEnum)) {
+                            Long recordId = Long.parseLong(k);
+                            Integer durationSeconds = ExamRecordCacheUtil.getDurationSeconds(recordId);
+                            Long examStudentId = ExamRecordCacheUtil.getExamStudentId(recordId);
+                            ExamStudentCacheBean examStudentCacheBean = teExamStudentService.getExamStudentCacheBean(examStudentId);
+                            //交卷
+                            teExamService.finish(examStudentCacheBean.getStudentId(), Long.parseLong(k), FinishTypeEnum.AUTO.name(), durationSeconds);
+                        }
+                    });
+                }
+            } else {
+                Map<String, Object> objectMap = redisUtil.getHashEntries(RedisKeyHelper.examActivityRecordCacheKey(teExamActivity.getId()));
+                if (Objects.nonNull(objectMap) && objectMap.size() > 0) {
+                    objectMap.forEach((k, v) -> {
+                        ExamRecordStatusEnum examRecordStatusEnum = (ExamRecordStatusEnum) v;
+                        //获取该考试批次下所有未交卷的考生的考试记录
+                        if (Objects.nonNull(examRecordStatusEnum) && (!Objects.equals(ExamRecordStatusEnum.FINISHED, examRecordStatusEnum) && !Objects.equals(ExamRecordStatusEnum.ANSWERING, examRecordStatusEnum))) {
+                            Long recordId = Long.parseLong(k);
+                            Integer durationSeconds = ExamRecordCacheUtil.getDurationSeconds(recordId);
+                            Long examStudentId = ExamRecordCacheUtil.getExamStudentId(recordId);
+                            ExamStudentCacheBean examStudentCacheBean = teExamStudentService.getExamStudentCacheBean(examStudentId);
+                            //交卷
+                            teExamService.finish(examStudentCacheBean.getStudentId(), Long.parseLong(k), FinishTypeEnum.AUTO.name(), durationSeconds);
+                        }
+                    });
+                }
+                TOeExamRecord tOeExamRecord = tOeExamRecordService.findOneByExamId(teExamActivity.getId(), ExamRecordStatusEnum.ANSWERING);
+                if (Objects.nonNull(tOeExamRecord)) {
+                    try {
+                        Thread.sleep(1000 * 60 * 15);//等15分钟再次检查
+                    } catch (InterruptedException e) {
+                        e.printStackTrace();
                     }
-                });
+                    execExamActivityJobLogic(key);
+                } else {
+                    return;
+                }
             }
         }
     }