wangliang 4 роки тому
батько
коміт
88db07b667

+ 3 - 3
themis-business/src/main/java/com/qmth/themis/business/dao/TEExamActivityMapper.java

@@ -10,6 +10,7 @@ import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * @Description: 考试场次 Mapper 接口
@@ -78,10 +79,9 @@ public interface TEExamActivityMapper extends BaseMapper<TEExamActivity> {
      * 获取考试待考列表
      *
      * @param studentId
-     * @param examId
-     * @param examActivityId
+     * @param examActivityIds
      * @param mode
      * @return
      */
-    public List<TEExamActivityDto> getWaitingExam(@Param("studentId") Long studentId, @Param("examId") Long examId, @Param("examActivityId") Long examActivityId, @Param("mode") String mode);
+    public List<TEExamActivityDto> getWaitingExam(@Param("studentId") Long studentId, @Param("examActivityIds") Set<Long> examActivityIds, @Param("mode") String mode);
 }

+ 3 - 3
themis-business/src/main/java/com/qmth/themis/business/service/TEExamActivityService.java

@@ -9,6 +9,7 @@ import com.qmth.themis.business.entity.TEExamActivity;
 
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * @Description: 考试场次 服务类
@@ -76,12 +77,11 @@ public interface TEExamActivityService extends IService<TEExamActivity> {
      * 获取考试待考列表
      *
      * @param studentId
-     * @param examId
-     * @param examActivityId
+     * @param examActivityIds
      * @param mode
      * @return
      */
-    public List<TEExamActivityDto> getWaitingExam(Long studentId, Long examId, Long examActivityId, String mode);
+    public List<TEExamActivityDto> getWaitingExam(Long studentId, Set<Long> examActivityIds, String mode);
 
     /**
      * 获取场次缓存

+ 4 - 4
themis-business/src/main/java/com/qmth/themis/business/service/impl/TEExamActivityServiceImpl.java

@@ -17,6 +17,7 @@ import org.springframework.stereotype.Service;
 import javax.annotation.Resource;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * @Description: 考试场次 服务实现类
@@ -105,14 +106,13 @@ public class TEExamActivityServiceImpl extends ServiceImpl<TEExamActivityMapper,
      * 获取考试待考列表
      *
      * @param studentId
-     * @param examId
-     * @param examActivityId
+     * @param examActivityIds
      * @param mode
      * @return
      */
     @Override
-    public List<TEExamActivityDto> getWaitingExam(Long studentId, Long examId, Long examActivityId, String mode) {
-        return teExamActivityMapper.getWaitingExam(studentId, examId, examActivityId, mode);
+    public List<TEExamActivityDto> getWaitingExam(Long studentId, Set<Long> examActivityIds, String mode) {
+        return teExamActivityMapper.getWaitingExam(studentId, examActivityIds, mode);
     }
 
     @Cacheable(value = "exam_activity", key = "#examActivityId", unless = "#result == null")

+ 56 - 45
themis-business/src/main/java/com/qmth/themis/business/service/impl/TEExamServiceImpl.java

@@ -43,6 +43,7 @@ import java.text.SimpleDateFormat;
 import java.time.LocalDateTime;
 import java.time.ZoneOffset;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * @Description: 考试批次 服务实现类
@@ -123,50 +124,60 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
     public List<TEExamDto> getWaitingExam(Long studentId, Long examId, Long orgId) {
         List<TEExamDto> list = teExamMapper.getWaitingExam(studentId, examId, orgId);
         if (Objects.nonNull(list) && list.size() > 0) {
-            list.forEach(s -> {
-                List<TEExamActivityDto> teExamActivityList = teExamActivityService.getWaitingExam(studentId, s.getId(), s.getExamActivityId(), s.getMode());
-                teExamActivityList.forEach(v -> {
-                    ExamCacheBean examCache = getExamCacheBean(v.getExamId());
-                    ExamStudentCacheBean examStudentCacheBean = teExamStudentService.getExamStudentCacheBean(v.getExamStudentId());
-                    v.setLeftExamCount(examCache.getExamCount() - examStudentCacheBean.getAlreadyExamCount());
-                    if (Objects.nonNull(v.getInProcessLivenessFixedRangeStr())) {
-                        String[] longs = v.getInProcessLivenessFixedRangeStr().trim().replaceAll(" ", "").split(",");
-                        List inProcessLivenessFixedRange = new ArrayList();
-                        for (int i = 0; i < longs.length; i++) {
-                            Integer integer = Integer.valueOf(longs[i].trim());
-                            inProcessLivenessFixedRange.add(integer);
-                        }
-                        if (Objects.equals(inProcessLivenessFixedRange.toString().trim().replaceAll(" ", ""), "")) {
-                            v.setInProcessLivenessFixedRange(null);
-                        } else {
-                            v.setInProcessLivenessFixedRange(inProcessLivenessFixedRange);
-                        }
+            Set<Long> examActivityIds = list.stream().map(s -> s.getExamActivityId()).collect(Collectors.toSet());
+            List<TEExamActivityDto> teExamActivityList = teExamActivityService.getWaitingExam(studentId, examActivityIds, null);
+            Map<Long, Set<TEExamActivityDto>> map = new HashMap<>();
+            teExamActivityList.forEach(v -> {
+                Set<TEExamActivityDto> teExamActivityDtos = null;
+                if (Objects.isNull(map.get(v.getExamId()))) {
+                    teExamActivityDtos = new HashSet<>();
+                } else {
+                    teExamActivityDtos = map.get(v.getExamId());
+                }
+                teExamActivityDtos.add(v);
+                map.put(v.getExamId(), teExamActivityDtos);
+                ExamCacheBean examCache = getExamCacheBean(v.getExamId());
+                ExamStudentCacheBean examStudentCacheBean = teExamStudentService.getExamStudentCacheBean(v.getExamStudentId());
+                v.setLeftExamCount(examCache.getExamCount() - examStudentCacheBean.getAlreadyExamCount());
+                if (Objects.nonNull(v.getInProcessLivenessFixedRangeStr())) {
+                    String[] longs = v.getInProcessLivenessFixedRangeStr().trim().replaceAll(" ", "").split(",");
+                    List inProcessLivenessFixedRange = new ArrayList();
+                    for (int i = 0; i < longs.length; i++) {
+                        Integer integer = Integer.valueOf(longs[i].trim());
+                        inProcessLivenessFixedRange.add(integer);
+                    }
+                    if (Objects.equals(inProcessLivenessFixedRange.toString().trim().replaceAll(" ", ""), "")) {
+                        v.setInProcessLivenessFixedRange(null);
+                    } else {
+                        v.setInProcessLivenessFixedRange(inProcessLivenessFixedRange);
+                    }
+                }
+                if (Objects.nonNull(v.getMonitorVideoSourceStr()) && !Objects.equals(v.getMonitorVideoSourceStr().toString().trim().replaceAll(" ", ""), "")) {
+                    v.setMonitorVideoSource(Arrays.asList(v.getMonitorVideoSourceStr().trim().toUpperCase().replaceAll(" ", "").split(",")));
+                    //加入monitorAudioEnable逻辑
+                    if (v.getMonitorVideoSource().size() == 4 || (v.getMonitorVideoSourceStr().toUpperCase().contains(MonitorVideoSourceEnum.CLIENT_SCREEN.name()) || v.getMonitorVideoSourceStr().toUpperCase().contains(MonitorVideoSourceEnum.CLIENT_CAMERA.name()))) {
+                        v.setMonitorAudioEnable(true);
                     }
-                    if (Objects.nonNull(v.getMonitorVideoSourceStr()) && !Objects.equals(v.getMonitorVideoSourceStr().toString().trim().replaceAll(" ", ""), "")) {
-                        v.setMonitorVideoSource(Arrays.asList(v.getMonitorVideoSourceStr().trim().toUpperCase().replaceAll(" ", "").split(",")));
-                        //加入monitorAudioEnable逻辑
-                        if (v.getMonitorVideoSource().size() == 4 || (v.getMonitorVideoSourceStr().toUpperCase().contains(MonitorVideoSourceEnum.CLIENT_SCREEN.name()) || v.getMonitorVideoSourceStr().toUpperCase().contains(MonitorVideoSourceEnum.CLIENT_CAMERA.name()))) {
-                            v.setMonitorAudioEnable(true);
+                    //加入hardwareTest逻辑
+                    if (v.getMonitorVideoSourceStr().toUpperCase().contains(MonitorVideoSourceEnum.CLIENT_CAMERA.name()) || (Objects.nonNull(v.getEntryAuthenticationPolicy()) && (Objects.equals(v.getEntryAuthenticationPolicy(), EntryAuthenticationPolicyEnum.LIVENESS_VERIFY.name()) || Objects.equals(v.getEntryAuthenticationPolicy(), EntryAuthenticationPolicyEnum.FACE_VERIFY_FORCE.name()))) || (Objects.nonNull(v.getCameraPhotoUpload()) && v.getCameraPhotoUpload() == 1)) {
+                        List<String> hardwareTest = v.getHardwareTest();
+                        if (Objects.isNull(hardwareTest)) {
+                            hardwareTest = new ArrayList<>();
                         }
-                        //加入hardwareTest逻辑
-                        if (v.getMonitorVideoSourceStr().toUpperCase().contains(MonitorVideoSourceEnum.CLIENT_CAMERA.name()) || (Objects.nonNull(v.getEntryAuthenticationPolicy()) && (Objects.equals(v.getEntryAuthenticationPolicy(), EntryAuthenticationPolicyEnum.LIVENESS_VERIFY.name()) || Objects.equals(v.getEntryAuthenticationPolicy(), EntryAuthenticationPolicyEnum.FACE_VERIFY_FORCE.name()))) || (Objects.nonNull(v.getCameraPhotoUpload()) && v.getCameraPhotoUpload() == 1)) {
-                            List<String> hardwareTest = v.getHardwareTest();
-                            if (Objects.isNull(hardwareTest)) {
-                                hardwareTest = new ArrayList<>();
-                            }
-                            hardwareTest.add(HardwareTestEnum.CAMERA.name());
-                            //取course缓存
-                            ExamCourseCacheBean examCourseCacheBean = teExamCourseService.getExamCourseCacheBean(v.getExamId(), v.getCourseCode());
-                            if (Objects.nonNull(examCourseCacheBean) && Objects.nonNull(examCourseCacheBean.getHasAudio()) && examCourseCacheBean.getHasAudio() == 1) {
-                                hardwareTest.add(HardwareTestEnum.AUDIOPLAY.name());
-                            }
-                            v.setHardwareTest(hardwareTest);
+                        hardwareTest.add(HardwareTestEnum.CAMERA.name());
+                        //取course缓存
+                        ExamCourseCacheBean examCourseCacheBean = teExamCourseService.getExamCourseCacheBean(v.getExamId(), v.getCourseCode());
+                        if (Objects.nonNull(examCourseCacheBean) && Objects.nonNull(examCourseCacheBean.getHasAudio()) && examCourseCacheBean.getHasAudio() == 1) {
+                            hardwareTest.add(HardwareTestEnum.AUDIOPLAY.name());
                         }
-                    } else {
-                        v.setMonitorVideoSource(null);
+                        v.setHardwareTest(hardwareTest);
                     }
-                });
-                s.setActivities(teExamActivityList);
+                } else {
+                    v.setMonitorVideoSource(null);
+                }
+            });
+            list.forEach(s -> {
+                s.setActivities(new ArrayList<>(map.get(s.getId())));
             });
         }
         return list;
@@ -370,11 +381,11 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
                 throw new BusinessException("没有到允许开考的时间");
             }
             //集中不启用统一收卷,考试快结束时,断点,再登录时, 时间已经超过考试截止时间,断点时,此时应该能登录继续作答
-            Integer forceFinish=ExamRecordCacheUtil.getForceFinish(recordId);
-            if(forceFinish!=null&&forceFinish.intValue()==1) {
-	            if (now.getTime() > end) {
-	                throw new BusinessException("允许开考的时间已结束");
-	            }
+            Integer forceFinish = ExamRecordCacheUtil.getForceFinish(recordId);
+            if (forceFinish != null && forceFinish.intValue() == 1) {
+                if (now.getTime() > end) {
+                    throw new BusinessException("允许开考的时间已结束");
+                }
             }
         }
         ExamRecordStatusEnum sta = ExamRecordCacheUtil.getStatus(recordId);

+ 5 - 7
themis-business/src/main/resources/mapper/TEExamActivityMapper.xml

@@ -149,13 +149,11 @@
             tee.id = tees.exam_id
         left join t_e_exam_activity teea on
             teea.id = tees.exam_activity_id
-        <where>
-            <if test="examActivityId != null and examActivityId != ''">
-                and teea.id = #{examActivityId}
-            </if>
-            <if test="examId != null and examId != ''">
-                and teea.exam_id = #{examId}
-            </if>
+        <where> 1 = 1
+            and teea.id in
+            <foreach collection="examActivityIds" item="examActivityId" index="index" open="(" close=")" separator=",">
+                #{examActivityId}
+            </foreach>
             <if test="studentId != null and studentId != ''">
                 and tees.student_id = #{studentId}
             </if>

+ 8 - 2
themis-task/src/main/java/com/qmth/themis/task/listener/service/impl/MqTaskLogicServiceImpl.java

@@ -4,11 +4,13 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.google.gson.Gson;
+import com.qmth.themis.business.cache.bean.ExamCacheBean;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.dto.MqDto;
 import com.qmth.themis.business.entity.TEExam;
 import com.qmth.themis.business.entity.TEExamActivity;
 import com.qmth.themis.business.entity.TMRocketMessage;
+import com.qmth.themis.business.service.TEExamService;
 import com.qmth.themis.business.service.TMRocketMessageService;
 import com.qmth.themis.business.util.JacksonUtil;
 import com.qmth.themis.business.util.RedisUtil;
@@ -45,6 +47,9 @@ public class MqTaskLogicServiceImpl implements MqTaskLogicService {
     @Resource
     QuartzService quartzService;
 
+    @Resource
+    TEExamService teExamService;
+
     /**
      * mq最大重试次数逻辑
      *
@@ -75,6 +80,7 @@ public class MqTaskLogicServiceImpl implements MqTaskLogicService {
         JSONArray jsonArray = (JSONArray) JSONArray.parse(String.valueOf(mqDto.getBody()));
         for (int i = 0; i < jsonArray.size(); i++) {
             TEExamActivity teExamActivity = JSONObject.toJavaObject((JSON) jsonArray.get(i), TEExamActivity.class);
+            ExamCacheBean examCacheBean = teExamService.getExamCacheBean(teExamActivity.getExamId());
             if (Objects.equals("delete", oper)) {
                 quartzService.deleteJob(teExamActivity.getCode(), QuartzTaskEnum.EXAM_ACTIVITY_JOB_GROUP_NAME.name());
             } else {
@@ -95,9 +101,9 @@ public class MqTaskLogicServiceImpl implements MqTaskLogicService {
                         String activityCode = teExamActivity.getCode();
                         //执行一次性延时任务
                         Map mapJob = new HashMap();
-                        mapJob.put("name", activityCode);
+                        mapJob.put("name", examCacheBean.getId() + "-" + activityCode);
                         quartzService.deleteJob(activityCode, QuartzTaskEnum.EXAM_ACTIVITY_JOB_GROUP_NAME.name());
-                        quartzService.addJob(ExamActivityJob.class, activityCode, QuartzTaskEnum.EXAM_ACTIVITY_JOB_GROUP_NAME.name(), cron, mapJob);
+                        quartzService.addJob(ExamActivityJob.class, examCacheBean.getId() + "-" + activityCode, QuartzTaskEnum.EXAM_ACTIVITY_JOB_GROUP_NAME.name(), cron, mapJob);
                     }
                 }
             }

+ 3 - 1
themis-task/src/main/java/com/qmth/themis/task/quartz/service/impl/QuartzLogicServiceImpl.java

@@ -55,8 +55,10 @@ public class QuartzLogicServiceImpl implements QuartzLogicService {
     public void execExamActivityJobLogic(String key) {
         log.info("key:{}", key);
         String[] strings = key.split("\\.");
+        String[] exams = strings[1].split("-");
         QueryWrapper<TEExamActivity> teExamActivityQueryWrapper = new QueryWrapper<>();
-        teExamActivityQueryWrapper.lambda().eq(TEExamActivity::getCode, strings[1]);
+        teExamActivityQueryWrapper.lambda().eq(TEExamActivity::getCode, exams[1])
+                .eq(TEExamActivity::getExamId, Long.parseLong(exams[0]));
         TEExamActivity teExamActivity = teExamActivityService.getOne(teExamActivityQueryWrapper);
         ExamCacheBean examCacheBean = teExamService.getExamCacheBean(teExamActivity.getExamId());
         if (Objects.nonNull(examCacheBean) && examCacheBean.getEnable() == 1 && Objects.nonNull(teExamActivity) && teExamActivity.getEnable() == 1) {