wangliang 4 лет назад
Родитель
Сommit
26a734c33f

+ 1 - 1
themis-business/src/main/java/com/qmth/themis/business/dto/request/TEExamDto.java

@@ -232,7 +232,7 @@ public class TEExamDto extends BaseEntity {
         this.scoreStatus = teExam.getScoreStatus();
         this.objectiveScorePolicy = teExam.getObjectiveScorePolicy();
         if (Objects.nonNull(teExam.getMonitorVideoSource()) && !Objects.equals(teExam.getMonitorVideoSource().trim().replaceAll(" ", ""), "")) {
-            setMonitorVideoSource(Arrays.asList(teExam.getMonitorVideoSource().trim().replaceAll(" ", "").split(",")));
+            setMonitorVideoSource(Arrays.asList(teExam.getMonitorVideoSource().trim().toUpperCase().replaceAll(" ", "").split(",")));
         } else {
             setMonitorVideoSource(null);
         }

+ 34 - 5
themis-business/src/main/java/com/qmth/themis/business/dto/response/TEExamActivityDto.java

@@ -2,7 +2,11 @@ package com.qmth.themis.business.dto.response;
 
 import com.qmth.themis.business.cache.bean.ExamActivityCacheBean;
 import com.qmth.themis.business.cache.bean.ExamCacheBean;
+import com.qmth.themis.business.cache.bean.ExamCourseCacheBean;
 import com.qmth.themis.business.cache.bean.ExamStudentCacheBean;
+import com.qmth.themis.business.enums.EntryAuthenticationPolicyEnum;
+import com.qmth.themis.business.enums.HardwareTestEnum;
+import com.qmth.themis.business.enums.MonitorVideoSourceEnum;
 
 import java.io.Serializable;
 import java.util.*;
@@ -48,14 +52,15 @@ public class TEExamActivityDto implements Serializable {
     private Date finishTime;//考场结束时间
     private Integer leftExamCount;//剩余考试次数
     private Integer mobilePhotoUpload;//是否允许使用移动端拍照答题,0:不开启,1:开启
-    private Boolean monitorAudioEnable;//客户端监控是否启用音频与麦克风
+    private Boolean monitorAudioEnable = false;//客户端监控是否启用音频与麦克风
+    private Long examId;//考试id
     private List<String> hardwareTest;//硬件检测
 
     public TEExamActivityDto() {
 
     }
 
-    public TEExamActivityDto(ExamCacheBean ec, ExamActivityCacheBean examActivityCacheBean, ExamStudentCacheBean examStudentCacheBean, Long examStudentId) {
+    public TEExamActivityDto(ExamCacheBean ec, ExamActivityCacheBean examActivityCacheBean, ExamStudentCacheBean examStudentCacheBean, Long examStudentId,ExamCourseCacheBean examCourseCacheBean) {
         this.id = examActivityCacheBean.getId();
         this.code = examActivityCacheBean.getCode();
         this.examStudentId = examStudentId;
@@ -79,8 +84,25 @@ public class TEExamActivityDto implements Serializable {
         } else if (Objects.nonNull(ec.getEndTime())) {
             this.maxFinishTime = ec.getEndTime().getTime();
         }
+        this.cameraPhotoUpload = ec.getCameraPhotoUpload();
+        this.entryAuthenticationPolicy = ec.getEntryAuthenticationPolicy().name();
         if (Objects.nonNull(ec.getMonitorVideoSource()) && !Objects.equals(ec.getMonitorVideoSource().toString().trim().replaceAll(" ", ""), "")) {
-            this.setMonitorVideoSource(Arrays.asList(ec.getMonitorVideoSource().trim().split(",")));
+            this.setMonitorVideoSource(Arrays.asList(ec.getMonitorVideoSource().trim().toUpperCase().split(",")));
+            //加入monitorAudioEnable逻辑
+            if (ec.getMonitorVideoSource().toUpperCase().contains(MonitorVideoSourceEnum.CLIENT_SCREEN.name()) && ec.getMonitorVideoSource().toUpperCase().contains(MonitorVideoSourceEnum.CLIENT_CAMERA.name())) {
+                this.monitorAudioEnable = true;
+            }
+            //加入hardwareTest逻辑
+            if (ec.getMonitorVideoSource().toUpperCase().contains(MonitorVideoSourceEnum.CLIENT_CAMERA.name()) || (Objects.nonNull(this.getEntryAuthenticationPolicy()) && (Objects.equals(this.getEntryAuthenticationPolicy(), EntryAuthenticationPolicyEnum.LIVENESS.name()) || Objects.equals(this.getEntryAuthenticationPolicy(), EntryAuthenticationPolicyEnum.FACE_VERIFY_FORCE.name()))) || (Objects.nonNull(this.getCameraPhotoUpload()) && this.getCameraPhotoUpload() == 1)) {
+                if (Objects.isNull(this.hardwareTest)) {
+                    this.hardwareTest = new ArrayList<>();
+                }
+                this.hardwareTest.add(HardwareTestEnum.CAMERA.name());
+                //取course缓存
+                if (Objects.nonNull(examCourseCacheBean) && Objects.nonNull(examCourseCacheBean.getHasAudio()) && examCourseCacheBean.getHasAudio() == 1) {
+                    this.hardwareTest.add(HardwareTestEnum.AUDIOPLAY.name());
+                }
+            }
         } else {
             this.setMonitorVideoSource(null);
         }
@@ -93,7 +115,6 @@ public class TEExamActivityDto implements Serializable {
         this.activityMaxDurationSeconds = examActivityCacheBean.getMaxDurationSeconds();
         this.examCount = ec.getExamCount();
         this.fouceFinish = ec.getForceFinish();
-        this.entryAuthenticationPolicy = ec.getEntryAuthenticationPolicy().name();
         this.inProcessFaceVerify = ec.getInProcessFaceVerify();
         this.inProcessFaceStrangerIgnore = ec.getInProcessFaceStrangerIgnore();
         this.inProcessLivenessVerify = ec.getInProcessLivenessVerify();
@@ -111,11 +132,19 @@ public class TEExamActivityDto implements Serializable {
             }
         }
         this.inProcessLivenessJudgePolicy = ec.getInProcessLivenessJudgePolicy().name();
-        this.cameraPhotoUpload = ec.getCameraPhotoUpload();
         this.startTime = examActivityCacheBean.getStartTime();
         this.finishTime = examActivityCacheBean.getFinishTime();
         this.leftExamCount = examStudentCacheBean.getLeftExamCount();
         this.mobilePhotoUpload = ec.getMobilePhotoUpload();
+        this.examId = ec.getId();
+    }
+
+    public Long getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Long examId) {
+        this.examId = examId;
     }
 
     public Boolean getMonitorAudioEnable() {

+ 28 - 0
themis-business/src/main/java/com/qmth/themis/business/enums/HardwareTestEnum.java

@@ -0,0 +1,28 @@
+package com.qmth.themis.business.enums;
+
+/**
+ * @Description: 硬件检测 enum
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2020/8/11
+ */
+public enum HardwareTestEnum {
+    CAMERA("摄像头"),
+
+    MICROPHONE("麦克风"),
+
+    VIDEOPLAY("视频播放"),
+
+    AUDIOPLAY("音频播放");
+
+    private HardwareTestEnum(String code) {
+        this.code = code;
+    }
+
+    private String code;
+
+    public String getCode() {
+        return code;
+    }
+}

+ 28 - 0
themis-business/src/main/java/com/qmth/themis/business/enums/MonitorVideoSourceEnum.java

@@ -0,0 +1,28 @@
+package com.qmth.themis.business.enums;
+
+/**
+ * @Description: 监控源 enum
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2020/8/11
+ */
+public enum MonitorVideoSourceEnum {
+    CLIENT_SCREEN("客户端屏幕"),
+
+    CLIENT_CAMERA("客户端摄像头"),
+
+    MOBILE_FIRST("移动端第一机位"),
+
+    MOBILE_SECOND("移动端第二机位");
+
+    private MonitorVideoSourceEnum(String code) {
+        this.code = code;
+    }
+
+    private String code;
+
+    public String getCode() {
+        return code;
+    }
+}

+ 30 - 15
themis-business/src/main/java/com/qmth/themis/business/service/impl/TEExamServiceImpl.java

@@ -15,9 +15,7 @@ import com.qmth.themis.business.dto.response.TEExamDto;
 import com.qmth.themis.business.dto.response.TEExamQueryDto;
 import com.qmth.themis.business.entity.TEExam;
 import com.qmth.themis.business.entity.TOeExamRecord;
-import com.qmth.themis.business.enums.ExamRecordStatusEnum;
-import com.qmth.themis.business.enums.FinishExamResultEnum;
-import com.qmth.themis.business.enums.FinishTypeEnum;
+import com.qmth.themis.business.enums.*;
 import com.qmth.themis.business.service.*;
 import com.qmth.themis.business.util.OssUtil;
 import com.qmth.themis.business.util.RedisUtil;
@@ -64,9 +62,6 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
     @Resource
     TOeExamRecordService toeExamRecordService;
 
-    @Resource
-    TEExamStudentService examStudentService;
-
     @Resource
     RedisUtil redisUtil;
 
@@ -105,11 +100,11 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
                 List<TEExamActivityDto> teExamActivityList = teExamActivityService.getWaitingExam(studentId, s.getId(), s.getExamActivityId());
                 teExamActivityList.forEach(v -> {
                     if (Objects.nonNull(v.getInProcessLivenessFixedRangeStr())) {
-                        String[] longs = v.getInProcessLivenessFixedRangeStr().trim().split(",");
+                        String[] longs = v.getInProcessLivenessFixedRangeStr().trim().replaceAll(" ", "").split(",");
                         List inProcessLivenessFixedRange = new ArrayList();
                         for (int i = 0; i < longs.length; i++) {
-                            Long l = Long.valueOf(longs[i].trim());
-                            inProcessLivenessFixedRange.add(l);
+                            Integer integer = Integer.valueOf(longs[i].trim());
+                            inProcessLivenessFixedRange.add(integer);
                         }
                         if (Objects.equals(inProcessLivenessFixedRange.toString().trim().replaceAll(" ", ""), "")) {
                             v.setInProcessLivenessFixedRange(null);
@@ -118,10 +113,30 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
                         }
                     }
                     if (Objects.nonNull(v.getMonitorVideoSourceStr()) && !Objects.equals(v.getMonitorVideoSourceStr().toString().trim().replaceAll(" ", ""), "")) {
-                        v.setMonitorVideoSource(Arrays.asList(v.getMonitorVideoSourceStr().trim().split(",")));
+                        v.setMonitorVideoSource(Arrays.asList(v.getMonitorVideoSourceStr().trim().toUpperCase().replaceAll(" ", "").split(",")));
+                        //加入monitorAudioEnable逻辑
+                        if (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.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);
+                        }
                     } else {
                         v.setMonitorVideoSource(null);
                     }
+                    ExamStudentCacheBean examStudentCacheBean = teExamStudentService.getExamStudnetCacheBean(v.getExamStudentId());
+                    v.setLeftExamCount(examStudentCacheBean.getLeftExamCount());
                 });
                 s.setActivities(teExamActivityList);
             });
@@ -155,11 +170,11 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
         }
         TEStudentCacheDto teStudentCacheDto = (TEStudentCacheDto) redisUtil.getStudent(es.getStudentId());
         if (teStudentCacheDto.getUnFinishedRecordId() != null) {
-        	Long recordId=teStudentCacheDto.getUnFinishedRecordId();
-        	
-        	ExamPaperCacheBean ep = teExamPaperService.getExamPaperCacheBean(ExamRecordCacheUtil.getPaperId(recordId));
-        	ExamCourseCacheBean ec = teExamCourseService.getExamCourseCacheBean(es.getExamId(), es.getCourseCode());
-        	ExamPrepareBean prepare = new ExamPrepareBean();
+            Long recordId = teStudentCacheDto.getUnFinishedRecordId();
+
+            ExamPaperCacheBean ep = teExamPaperService.getExamPaperCacheBean(ExamRecordCacheUtil.getPaperId(recordId));
+            ExamCourseCacheBean ec = teExamCourseService.getExamCourseCacheBean(es.getExamId(), es.getCourseCode());
+            ExamPrepareBean prepare = new ExamPrepareBean();
             prepare.setRecordId(recordId);
             prepare.setAudioPlayCount(ep.getAudioPlayCount());
             prepare.setHasAudio((ep.getHasAudio() == null || ep.getHasAudio().intValue() == 0 ? false : true));

+ 2 - 1
themis-business/src/main/resources/mapper/TEExamActivityMapper.xml

@@ -139,7 +139,8 @@
             tee.mobile_photo_upload as mobilePhotoUpload,
             teea.start_time as startTime,
             teea.finish_time as finishTime,
-            tees.left_exam_count as leftExamCount
+            tees.left_exam_count as leftExamCount,
+            tee.id as examId
         from
             t_e_exam_student tees
         left join t_e_exam_course teec on

+ 6 - 1
themis-exam/src/main/java/com/qmth/themis/exam/api/TEStudentController.java

@@ -10,6 +10,7 @@ import com.qmth.themis.business.cache.ExamRecordCacheUtil;
 import com.qmth.themis.business.cache.RedisKeyHelper;
 import com.qmth.themis.business.cache.bean.ExamActivityCacheBean;
 import com.qmth.themis.business.cache.bean.ExamCacheBean;
+import com.qmth.themis.business.cache.bean.ExamCourseCacheBean;
 import com.qmth.themis.business.cache.bean.ExamStudentCacheBean;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.dto.AuthDto;
@@ -87,6 +88,9 @@ public class TEStudentController {
     @Resource
     TEExamActivityService teExamActivityService;
 
+    @Resource
+    TEExamCourseService teExamCourseService;
+
     @ApiOperation(value = "学生登录接口")
     @RequestMapping(value = "/login", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "学生信息", response = TEExamResultDto.class)})
@@ -239,7 +243,8 @@ public class TEStudentController {
                     //发送mq,增加断点次数记录
                     MqDto mqDto = new MqDto(MqTopicEnum.themisTopic.getCode(), MqTagEnum.examBreakHistory.name(), JacksonUtil.parseJson(objectMap), MqEnum.EXAM_BREAK, String.valueOf(recordId), "增加断点记录");
                     mqDtoService.assembleSendOneWayMsg(mqDto);
-                    TEExamActivityDto teExamActivityDto = new TEExamActivityDto(ec, examActivityCacheBean, examStudentCacheBean, examStudentId);
+                    ExamCourseCacheBean examCourseCacheBean = teExamCourseService.getExamCourseCacheBean(ec.getId(), examStudentCacheBean.getCourseCode());
+                    TEExamActivityDto teExamActivityDto = new TEExamActivityDto(ec, examActivityCacheBean, examStudentCacheBean, examStudentId, examCourseCacheBean);
                     Gson gson = new Gson();
                     ExamActivityUnFinishBean examActivityUnFinishBean = gson.fromJson(gson.toJson(teExamActivityDto), ExamActivityUnFinishBean.class);
                     examActivityUnFinishBean.setRecordId(recordId);