Răsfoiți Sursa

场次相关功能修改

lideyin 4 ani în urmă
părinte
comite
121a3773a5

+ 42 - 67
examcloud-core-oe-student-api-provider/src/main/java/cn/com/qmth/examcloud/core/oe/student/api/controller/ExamControlController.java

@@ -1,47 +1,10 @@
 package cn.com.qmth.examcloud.core.oe.student.api.controller;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
-
-import javax.validation.Valid;
-
-import org.apache.commons.lang.math.RandomUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.ModelAttribute;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
-
-import com.google.common.collect.Maps;
-import com.mysql.cj.util.StringUtils;
-
 import cn.com.qmth.examcloud.api.commons.security.bean.User;
 import cn.com.qmth.examcloud.commons.exception.StatusException;
 import cn.com.qmth.examcloud.commons.util.Util;
 import cn.com.qmth.examcloud.core.oe.student.base.utils.Check;
-import cn.com.qmth.examcloud.core.oe.student.bean.BatchGetUpyunSignDomain;
-import cn.com.qmth.examcloud.core.oe.student.bean.BatchGetUpyunSignDomainQuery;
-import cn.com.qmth.examcloud.core.oe.student.bean.CheckExamInProgressInfo;
-import cn.com.qmth.examcloud.core.oe.student.bean.CheckQrCodeInfo;
-import cn.com.qmth.examcloud.core.oe.student.bean.EndExamInfo;
-import cn.com.qmth.examcloud.core.oe.student.bean.ExamProcessResultInfo;
-import cn.com.qmth.examcloud.core.oe.student.bean.GetAliyunSignDomain;
-import cn.com.qmth.examcloud.core.oe.student.bean.GetQrCodeReq;
-import cn.com.qmth.examcloud.core.oe.student.bean.GetUploadedFileAcknowledgeStatusReq;
-import cn.com.qmth.examcloud.core.oe.student.bean.GetUpyunSignDomain;
-import cn.com.qmth.examcloud.core.oe.student.bean.GetUpyunSignDomainQuery;
-import cn.com.qmth.examcloud.core.oe.student.bean.GetYunSignDomain;
-import cn.com.qmth.examcloud.core.oe.student.bean.GetYunSignDomainQuery;
-import cn.com.qmth.examcloud.core.oe.student.bean.GetYunSignatureReq;
-import cn.com.qmth.examcloud.core.oe.student.bean.SaveUploadedFileAcknowledgeStatusReq;
-import cn.com.qmth.examcloud.core.oe.student.bean.SaveUploadedFileReq;
-import cn.com.qmth.examcloud.core.oe.student.bean.StartExamInfo;
-import cn.com.qmth.examcloud.core.oe.student.bean.UpyunSignatureInfo;
+import cn.com.qmth.examcloud.core.oe.student.bean.*;
 import cn.com.qmth.examcloud.core.oe.student.service.ExamControlService;
 import cn.com.qmth.examcloud.core.oe.student.service.ExamFileAnswerService;
 import cn.com.qmth.examcloud.core.oe.student.service.ExamRecordDataService;
@@ -64,8 +27,19 @@ import cn.com.qmth.examcloud.web.support.ControllerSupport;
 import cn.com.qmth.examcloud.web.support.Naked;
 import cn.com.qmth.examcloud.web.upyun.UpyunPathEnvironmentInfo;
 import cn.com.qmth.examcloud.web.upyun.UpyunService;
+import com.google.common.collect.Maps;
+import com.mysql.cj.util.StringUtils;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang.math.RandomUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
 
 @Api(tags = "在线考试控制")
 @RestController
@@ -89,7 +63,7 @@ public class ExamControlController extends ControllerSupport {
     private RedisClient redisClient;
     @Autowired
     private ExamRecordDataService examRecordDataService;
-    
+
     /**
      * 开始考试
      */
@@ -162,9 +136,9 @@ public class ExamControlController extends ControllerSupport {
         long startTime = System.currentTimeMillis();
 
         ExamingSession examingSession = examingSessionService.getExamingSession(studentId);
-        
-        if(examingSession==null) {
-        	throw new StatusException("8010", "无效的会话,请离开考试");
+
+        if (examingSession == null) {
+            throw new StatusException("8010", "无效的会话,请离开考试");
         }
 
         if (log.isDebugEnabled()) {
@@ -196,35 +170,36 @@ public class ExamControlController extends ControllerSupport {
     public UpyunSignatureInfo getUpyunSignature(@ModelAttribute @Valid GetYunSignatureReq req) {
         return examControlService.getUpyunSignature(req);
     }
+
     /**
      * 获取云存储上传签名(微信小程序调用)
      */
     @ApiOperation(value = "获取文件上传签名(微信小程序调用)")
     @PostMapping("/yunSignature")
     public GetYunSignDomain getYunSignature(@ModelAttribute @Valid GetYunSignatureReq req) {
-        
-        if(FileStorageType.UPYUN.equals(FileStorageUtil.getFileStorageType())) {
-        	GetUpyunSignDomain result = new GetUpyunSignDomain();
-        	Map<String, String> params = Maps.newHashMap();
-        	UpyunSignatureInfo info=examControlService.getUpyunSignature(req);
-        	String signIdentifier = String.valueOf(System.currentTimeMillis());
-        	params.put("authorization", info.getSignature());
-        	params.put("policy", info.getPolicy());
-        	result.setAccessUrl(FileStorageHelper.getUrl(info.getUpyunFileDomain(), info.getFilePath()));
+
+        if (FileStorageType.UPYUN.equals(FileStorageUtil.getFileStorageType())) {
+            GetUpyunSignDomain result = new GetUpyunSignDomain();
+            Map<String, String> params = Maps.newHashMap();
+            UpyunSignatureInfo info = examControlService.getUpyunSignature(req);
+            String signIdentifier = String.valueOf(System.currentTimeMillis());
+            params.put("authorization", info.getSignature());
+            params.put("policy", info.getPolicy());
+            result.setAccessUrl(FileStorageHelper.getUrl(info.getUpyunFileDomain(), info.getFilePath()));
             result.setFormUrl(info.getUploadUrl());
             result.setFormParams(params);
             result.setSignIdentifier(signIdentifier);
-        	return result;
+            return result;
         }
-        if(FileStorageType.ALIYUN.equals(FileStorageUtil.getFileStorageType())) {
-        	String fileSuffix = req.getFileSuffix();
+        if (FileStorageType.ALIYUN.equals(FileStorageUtil.getFileStorageType())) {
+            String fileSuffix = req.getFileSuffix();
             if (StringUtils.isNullOrEmpty(fileSuffix)) {
                 throw new StatusException("5002", "文件后缀名不允许为空");
             }
-            
+
             ExamRecordData examRecordData = examRecordDataService.getExamRecordDataCache(req.getExamRecordDataId());
             fileSuffix = fileSuffix.indexOf(".") == -1 ? "." + fileSuffix : fileSuffix;
-            
+
             StringBuffer filePath = new StringBuffer();
 
             filePath.append(OE_ANSWER_FILE_PATH).append(SEPARATOR)
@@ -243,7 +218,7 @@ public class ExamControlController extends ControllerSupport {
             String signIdentifier = String.valueOf(System.currentTimeMillis());
             FileStoragePathEnvInfo env = new FileStoragePathEnvInfo();
             env.setRelativePath(filePath.toString());
-            YunHttpRequest aliYunHttpRequest = FileStorageUtil.getSignature(FileStorageType.ALIYUN,Constants.MINI_PROGRAM_ANWSER_SITEID, env, req.getFileMd5());
+            YunHttpRequest aliYunHttpRequest = FileStorageUtil.getSignature(FileStorageType.ALIYUN, Constants.MINI_PROGRAM_ANWSER_SITEID, env, req.getFileMd5());
             result.setAccessUrl(aliYunHttpRequest.getAccessUrl());
             result.setFormUrl(aliYunHttpRequest.getFormUrl());
             result.setFormParams(aliYunHttpRequest.getFormParams());
@@ -284,7 +259,7 @@ public class ExamControlController extends ControllerSupport {
             String fileUrl = "";
             if (req.getFilePath().indexOf(",") > -1) {
                 for (String url : req.getFilePath().split(",")) {
-                    fileUrl += FileStorageUtil.realPath(url)+ ",";
+                    fileUrl += FileStorageUtil.realPath(url) + ",";
                 }
                 fileUrl = fileUrl.substring(0, fileUrl.length() - 1);
             } else {
@@ -336,10 +311,10 @@ public class ExamControlController extends ControllerSupport {
     public GetUpyunSignDomain getCapturePhotoUpYunSign(GetYunSignDomainQuery query) {
         return getUpYunSign(query);
     }
-    
+
     //又拍云签名
     private GetUpyunSignDomain getUpYunSign(GetYunSignDomainQuery query) {
-    	String fileSuffix = query.getFileSuffix();
+        String fileSuffix = query.getFileSuffix();
         if (StringUtils.isNullOrEmpty(fileSuffix)) {
             throw new StatusException("200001", "文件后缀名不允许为空");
         }
@@ -363,22 +338,22 @@ public class ExamControlController extends ControllerSupport {
         result.setSignIdentifier(signIdentifier);
         return result;
     }
-    
+
     @ApiOperation(value = "获取抓拍照片的云存储签名")
     @GetMapping("/getCapturePhotoYunSign")
     public GetYunSignDomain getCapturePhotoYunSign(GetYunSignDomainQuery query) {
-        if(FileStorageType.UPYUN.equals(FileStorageUtil.getFileStorageType())) {
-        	return getUpYunSign(query);
+        if (FileStorageType.UPYUN.equals(FileStorageUtil.getFileStorageType())) {
+            return getUpYunSign(query);
         }
-        if(FileStorageType.ALIYUN.equals(FileStorageUtil.getFileStorageType())) {
-        	return getAliYunSign(query);
+        if (FileStorageType.ALIYUN.equals(FileStorageUtil.getFileStorageType())) {
+            return getAliYunSign(query);
         }
         throw new StatusException("3002", "未配置正确云存储类型");
     }
 
     //阿里云签名
     private GetAliyunSignDomain getAliYunSign(GetYunSignDomainQuery query) {
-    	String fileSuffix = query.getFileSuffix();
+        String fileSuffix = query.getFileSuffix();
         if (StringUtils.isNullOrEmpty(fileSuffix)) {
             throw new StatusException("4001", "文件后缀名不允许为空");
         }
@@ -393,7 +368,7 @@ public class ExamControlController extends ControllerSupport {
         env.setRootOrgId(accessUser.getRootOrgId().toString());
         env.setUserId(accessUser.getUserId().toString());
         env.setFileSuffix(fileSuffix);
-        YunHttpRequest aliYunHttpRequest = FileStorageUtil.getSignature(FileStorageType.ALIYUN,Constants.CAPTURE_PHOTO_UPYUN_SITEID, env, query.getFileMd5());
+        YunHttpRequest aliYunHttpRequest = FileStorageUtil.getSignature(FileStorageType.ALIYUN, Constants.CAPTURE_PHOTO_UPYUN_SITEID, env, query.getFileMd5());
         redisClient.set(aliyunSignRedisKey, aliYunHttpRequest, 60);
         result.setAccessUrl(aliYunHttpRequest.getAccessUrl());
         result.setFormUrl(aliYunHttpRequest.getFormUrl());

+ 37 - 13
examcloud-core-oe-student-dao/src/main/java/cn/com/qmth/examcloud/core/oe/student/dao/entity/ExamRecordDataEntity.java

@@ -218,17 +218,27 @@ public class ExamRecordDataEntity extends JpaEntity {
      * 批次号,自动服务遍历数据用
      */
     private Long batchNum;
-    
+
     /**
      * 试卷题目数量(校验提交答案的order)
      */
     private Integer questionCount;
-    
+
     /**
      * 是否是全客观题卷  1:是   0:否
      */
     private Boolean isAllObjectivePaper;
-    
+
+    /**
+     * 场次id
+     */
+    private Long examStageId;
+
+    /**
+     * 场次号
+     */
+    private Integer examStageOrder;
+
     public Long getId() {
         return id;
     }
@@ -489,17 +499,17 @@ public class ExamRecordDataEntity extends JpaEntity {
         return syncStatus;
     }
 
-    
+
     public void setSyncStatus(SyncStatus syncStatus) {
         this.syncStatus = syncStatus;
     }
 
-    
+
     public Long getBatchNum() {
         return batchNum;
     }
 
-    
+
     public void setBatchNum(Long batchNum) {
         this.batchNum = batchNum;
     }
@@ -520,25 +530,39 @@ public class ExamRecordDataEntity extends JpaEntity {
         this.baiduFaceLivenessSuccessPercent = baiduFaceLivenessSuccessPercent;
     }
 
-    
+
     public Integer getQuestionCount() {
         return questionCount;
     }
 
-    
+
     public void setQuestionCount(Integer questionCount) {
         this.questionCount = questionCount;
     }
 
-    
+
     public Boolean getIsAllObjectivePaper() {
         return isAllObjectivePaper;
     }
 
-    
+
     public void setIsAllObjectivePaper(Boolean isAllObjectivePaper) {
         this.isAllObjectivePaper = isAllObjectivePaper;
     }
-    
-    
-}
+
+    public Long getExamStageId() {
+        return examStageId;
+    }
+
+    public void setExamStageId(Long examStageId) {
+        this.examStageId = examStageId;
+    }
+
+    public Integer getExamStageOrder() {
+        return examStageOrder;
+    }
+
+    public void setExamStageOrder(Integer examStageOrder) {
+        this.examStageOrder = examStageOrder;
+    }
+}

+ 3 - 2
examcloud-core-oe-student-service/src/main/java/cn/com/qmth/examcloud/core/oe/student/service/ExamRecordDataService.java

@@ -27,8 +27,9 @@ public interface ExamRecordDataService {
      * @param isFullyObjective
      * @return
      */
-    ExamRecordData createExamRecordData(ExamingSession examingSession, ExamSettingsCacheBean examBean, CourseCacheBean courseBean,
-                                        String basePaperId,boolean isFullyObjective);
+    ExamRecordData createExamRecordData(ExamingSession examingSession, ExamSettingsCacheBean examBean,
+                                        CourseCacheBean courseBean,String basePaperId,boolean isFullyObjective,
+                                        Long examStageId,Integer examStageOrder);
 
     /**
      *

+ 37 - 74
examcloud-core-oe-student-service/src/main/java/cn/com/qmth/examcloud/core/oe/student/service/impl/ExamControlServiceImpl.java

@@ -1,47 +1,13 @@
 package cn.com.qmth.examcloud.core.oe.student.service.impl;
 
-import java.io.UnsupportedEncodingException;
-import java.net.URLEncoder;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Random;
-import java.util.Set;
-import java.util.TimeZone;
-import java.util.concurrent.TimeUnit;
-import java.util.stream.Collectors;
-
-import org.apache.commons.collections.CollectionUtils;
-import org.apache.commons.lang.math.RandomUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.time.DateUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import com.google.common.base.Splitter;
-
 import cn.com.qmth.examcloud.api.commons.enums.ExamSpecialSettingsType;
+import cn.com.qmth.examcloud.api.commons.enums.ExamStageStartExamStatus;
 import cn.com.qmth.examcloud.api.commons.enums.ExamType;
 import cn.com.qmth.examcloud.api.commons.security.bean.User;
 import cn.com.qmth.examcloud.api.commons.security.bean.UserType;
 import cn.com.qmth.examcloud.commons.exception.StatusException;
-import cn.com.qmth.examcloud.commons.util.ByteUtil;
-import cn.com.qmth.examcloud.commons.util.JsonUtil;
-import cn.com.qmth.examcloud.commons.util.SHA256;
-import cn.com.qmth.examcloud.commons.util.StringUtil;
 import cn.com.qmth.examcloud.commons.util.UUID;
-import cn.com.qmth.examcloud.commons.util.UrlUtil;
-import cn.com.qmth.examcloud.commons.util.Util;
+import cn.com.qmth.examcloud.commons.util.*;
 import cn.com.qmth.examcloud.core.oe.admin.api.ExamRecordCloudService;
 import cn.com.qmth.examcloud.core.oe.admin.api.SyncExamDataCloudService;
 import cn.com.qmth.examcloud.core.oe.admin.api.bean.ExamQuestionBean;
@@ -60,27 +26,15 @@ import cn.com.qmth.examcloud.core.oe.student.api.response.GetExamRecordPaperStru
 import cn.com.qmth.examcloud.core.oe.student.api.response.GetExamRecordQuestionsResp;
 import cn.com.qmth.examcloud.core.oe.student.base.utils.CommonUtil;
 import cn.com.qmth.examcloud.core.oe.student.base.utils.QuestionTypeUtil;
-import cn.com.qmth.examcloud.core.oe.student.bean.CheckExamInProgressInfo;
-import cn.com.qmth.examcloud.core.oe.student.bean.CheckQrCodeInfo;
-import cn.com.qmth.examcloud.core.oe.student.bean.EndExamInfo;
-import cn.com.qmth.examcloud.core.oe.student.bean.GetQrCodeReq;
-import cn.com.qmth.examcloud.core.oe.student.bean.GetYunSignatureReq;
-import cn.com.qmth.examcloud.core.oe.student.bean.StartExamInfo;
-import cn.com.qmth.examcloud.core.oe.student.bean.UploadedFileAnswerInfo;
-import cn.com.qmth.examcloud.core.oe.student.bean.UpyunSignatureInfo;
-import cn.com.qmth.examcloud.core.oe.student.service.ExamBossService;
-import cn.com.qmth.examcloud.core.oe.student.service.ExamControlService;
-import cn.com.qmth.examcloud.core.oe.student.service.ExamFaceLivenessVerifyService;
-import cn.com.qmth.examcloud.core.oe.student.service.ExamRecordDataService;
-import cn.com.qmth.examcloud.core.oe.student.service.ExamRecordPaperStructService;
-import cn.com.qmth.examcloud.core.oe.student.service.ExamRecordQuestionsService;
-import cn.com.qmth.examcloud.core.oe.student.service.ExamingSessionService;
-import cn.com.qmth.examcloud.core.oe.student.service.FaceBiopsyService;
+import cn.com.qmth.examcloud.core.oe.student.bean.*;
+import cn.com.qmth.examcloud.core.oe.student.service.*;
 import cn.com.qmth.examcloud.core.oe.task.api.ExamCaptureCloudService;
 import cn.com.qmth.examcloud.core.oe.task.api.request.SaveExamCaptureSyncCompareResultReq;
 import cn.com.qmth.examcloud.core.oe.task.api.request.UpdateExamCaptureQueuePriorityReq;
 import cn.com.qmth.examcloud.examwork.api.ExamCloudService;
+import cn.com.qmth.examcloud.examwork.api.ExamStageCloudService;
 import cn.com.qmth.examcloud.examwork.api.request.GetExamPropertyReq;
+import cn.com.qmth.examcloud.examwork.api.request.ModifyExamStageStartExamStatusReq;
 import cn.com.qmth.examcloud.examwork.api.response.GetExamPropertyResp;
 import cn.com.qmth.examcloud.question.commons.core.paper.DefaultPaper;
 import cn.com.qmth.examcloud.question.commons.core.paper.DefaultQuestionGroup;
@@ -91,30 +45,12 @@ import cn.com.qmth.examcloud.reports.commons.bean.OnlineExamStudentReport;
 import cn.com.qmth.examcloud.reports.commons.util.ReportsUtil;
 import cn.com.qmth.examcloud.support.Constants;
 import cn.com.qmth.examcloud.support.cache.CacheHelper;
-import cn.com.qmth.examcloud.support.cache.bean.CourseCacheBean;
-import cn.com.qmth.examcloud.support.cache.bean.ExamOrgSettingsCacheBean;
-import cn.com.qmth.examcloud.support.cache.bean.ExamPropertyCacheBean;
-import cn.com.qmth.examcloud.support.cache.bean.ExamSettingsCacheBean;
-import cn.com.qmth.examcloud.support.cache.bean.ExamStudentCacheBean;
-import cn.com.qmth.examcloud.support.cache.bean.ExamStudentSettingsCacheBean;
-import cn.com.qmth.examcloud.support.cache.bean.ExtractConfigCacheBean;
-import cn.com.qmth.examcloud.support.cache.bean.ExtractConfigDetailCacheBean;
-import cn.com.qmth.examcloud.support.cache.bean.ExtractConfigPaperCacheBean;
-import cn.com.qmth.examcloud.support.cache.bean.StudentCacheBean;
-import cn.com.qmth.examcloud.support.cache.bean.SysPropertyCacheBean;
+import cn.com.qmth.examcloud.support.cache.bean.*;
 import cn.com.qmth.examcloud.support.enums.ExamProperties;
 import cn.com.qmth.examcloud.support.enums.ExamRecordStatus;
 import cn.com.qmth.examcloud.support.enums.FaceBiopsyScheme;
 import cn.com.qmth.examcloud.support.enums.HandInExamType;
-import cn.com.qmth.examcloud.support.examing.ExamBoss;
-import cn.com.qmth.examcloud.support.examing.ExamQuestion;
-import cn.com.qmth.examcloud.support.examing.ExamRecordData;
-import cn.com.qmth.examcloud.support.examing.ExamRecordPaperStruct;
-import cn.com.qmth.examcloud.support.examing.ExamRecordQuestions;
-import cn.com.qmth.examcloud.support.examing.ExamingActivityTime;
-import cn.com.qmth.examcloud.support.examing.ExamingHeartbeat;
-import cn.com.qmth.examcloud.support.examing.ExamingSession;
-import cn.com.qmth.examcloud.support.examing.ExamingStatus;
+import cn.com.qmth.examcloud.support.examing.*;
 import cn.com.qmth.examcloud.support.helper.ExamCacheTransferHelper;
 import cn.com.qmth.examcloud.support.helper.FaceBiopsyHelper;
 import cn.com.qmth.examcloud.support.redis.RedisKeyHelper;
@@ -128,9 +64,26 @@ import cn.com.qmth.examcloud.ws.api.enums.WebSocketEventType;
 import cn.com.qmth.examcloud.ws.api.request.SendFileAnswerMessageReq;
 import cn.com.qmth.examcloud.ws.api.request.SendScanQrCodeMessageReq;
 import cn.com.qmth.examcloud.ws.api.request.SendTextReq;
+import com.google.common.base.Splitter;
 import main.java.com.upyun.Base64Coder;
 import main.java.com.upyun.UpException;
 import main.java.com.upyun.UpYunUtils;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang.math.RandomUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.time.DateUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 
 /**
  * @author chenken
@@ -181,6 +134,8 @@ public class ExamControlServiceImpl implements ExamControlService {
 
     @Autowired
     SyncExamDataCloudService syncExamDataCloudService;
+    @Autowired
+    private ExamStageCloudService examStageCloudService;
 
     private static final String SEPARATOR = "/";
 
@@ -256,8 +211,9 @@ public class ExamControlServiceImpl implements ExamControlService {
 
         // 生成考试记录
         startTime = System.currentTimeMillis();
+        ExamStudentCacheBean examStudent = CacheHelper.getExamStudent(examStudentId);
         ExamRecordData examRecordData = examRecordDataService.createExamRecordData(examingSession, examBean, courseBean,
-                paperId, extractConfigPaper.getDefaultPaper().getFullyObjective());
+                paperId, extractConfigPaper.getDefaultPaper().getFullyObjective(), examStudent.getStudentId(), examStudent.getExamStageOrder());
 
         // 如果开启人脸比对,将同步人脸比对结果存储到抓后结果表中
         Long rootOrgId = examRecordData.getRootOrgId();
@@ -322,6 +278,12 @@ public class ExamControlServiceImpl implements ExamControlService {
             log.debug("9 初始化考试会话耗时:" + (System.currentTimeMillis() - startTime) + " ms");
         }
 
+        //更改考务中的考试状态 TODO 高并发下此处可能会影响开考的性能
+        ModifyExamStageStartExamStatusReq req = new ModifyExamStageStartExamStatusReq();
+        req.setExamStageId(examStudent.getExamStageId());
+        req.setExamStageStartExamStatus(ExamStageStartExamStatus.STARTED.name());
+        examStageCloudService.modifyExamStageStartExamStatus(req);
+
         //设置并保存上次活动时间
         setAndSaveActiveTime(examRecordData.getId());
 
@@ -1420,7 +1382,7 @@ public class ExamControlServiceImpl implements ExamControlService {
         ExamingHeartbeat examingHeartbeat = redisClient.get(examingHeartbeatKey, ExamingHeartbeat.class);
 
         if (null != examingHeartbeat
-                && (examingHeartbeat.getCost()*1000) >= examSessionInfo.getExamDuration()) {
+                && (examingHeartbeat.getCost() * 1000) >= examSessionInfo.getExamDuration()) {
             throw new StatusException("8002", "考试会话已过期,请重新开考");
         }
 
@@ -1447,6 +1409,7 @@ public class ExamControlServiceImpl implements ExamControlService {
 
     /**
      * 设置并保存活动时间
+     *
      * @param examRecrodDataId 考试记录id
      */
     private void setAndSaveActiveTime(Long examRecrodDataId) {

+ 4 - 1
examcloud-core-oe-student-service/src/main/java/cn/com/qmth/examcloud/core/oe/student/service/impl/ExamRecordDataServiceImpl.java

@@ -75,7 +75,8 @@ public class ExamRecordDataServiceImpl implements ExamRecordDataService {
     @Transactional
     @Override
     public ExamRecordData createExamRecordData(ExamingSession examingSession, ExamSettingsCacheBean examBean,
-                                               CourseCacheBean courseBean, String basePaperId,boolean isFullyObjective) {
+                                               CourseCacheBean courseBean, String basePaperId,boolean isFullyObjective,
+                                               Long examStageId,Integer examStageOrder) {
         ExamRecordDataEntity examRecordData = new ExamRecordDataEntity();
         examRecordData.setExamId(examBean.getId());
         examRecordData.setExamType(ExamType.valueOf(examBean.getExamType()));
@@ -103,6 +104,8 @@ public class ExamRecordDataServiceImpl implements ExamRecordDataService {
         examRecordData.setIsIllegality(false);
         examRecordData.setIsWarn(false);
         examRecordData.setIsAudit(false);
+        examRecordData.setExamStageId(examStageId);
+        examRecordData.setExamStageOrder(examStageOrder);
         examRecordDataRepo.save(examRecordData);
         ExamRecordData bean = of(examRecordData);
         //存入redis