Browse Source

优化网考后端代码

lideyin 5 years ago
parent
commit
434bdbc8e1

+ 19 - 5
examcloud-core-oe-admin-api-provider/src/main/java/cn/com/qmth/examcloud/core/oe/admin/api/provider/ExamRecordForMarkingCloudServiceProvider.java

@@ -4,16 +4,14 @@ import cn.com.qmth.examcloud.commons.exception.StatusException;
 import cn.com.qmth.examcloud.core.oe.admin.api.ExamRecordForMarkingCloudService;
 import cn.com.qmth.examcloud.core.oe.admin.api.bean.ExamRecordDataBean;
 import cn.com.qmth.examcloud.core.oe.admin.api.bean.ExamRecordForMarkingBean;
-import cn.com.qmth.examcloud.core.oe.admin.api.request.FindExamRecordForMarkingInfoReq;
-import cn.com.qmth.examcloud.core.oe.admin.api.request.GetSingleExamRecordDataReq;
-import cn.com.qmth.examcloud.core.oe.admin.api.request.QueryValidExamRecordInfoPageReq;
-import cn.com.qmth.examcloud.core.oe.admin.api.request.QueryValidExamRecordInfoReq;
+import cn.com.qmth.examcloud.core.oe.admin.api.request.*;
 import cn.com.qmth.examcloud.core.oe.admin.api.response.FindExamRecordForMarkingInfoResp;
 import cn.com.qmth.examcloud.core.oe.admin.api.response.GetSingleExamRecordDataResp;
 import cn.com.qmth.examcloud.core.oe.admin.api.response.QueryValidExamRecordInfoPageResp;
 import cn.com.qmth.examcloud.core.oe.admin.api.response.QueryValidExamRecordInfoResp;
 import cn.com.qmth.examcloud.core.oe.admin.base.utils.Check;
 import cn.com.qmth.examcloud.core.oe.admin.dao.ExamRecordDataRepo;
+import cn.com.qmth.examcloud.core.oe.admin.dao.ExamRecordForMarkingRepo;
 import cn.com.qmth.examcloud.core.oe.admin.dao.ExamStudentRepo;
 import cn.com.qmth.examcloud.core.oe.admin.dao.entity.ExamRecordDataEntity;
 import cn.com.qmth.examcloud.core.oe.admin.dao.entity.ExamRecordForMarkingEntity;
@@ -22,6 +20,7 @@ import cn.com.qmth.examcloud.core.oe.admin.service.ExamRecordForMarkingService;
 import cn.com.qmth.examcloud.web.helpers.GlobalHelper;
 import cn.com.qmth.examcloud.web.support.ControllerSupport;
 import com.google.common.collect.Lists;
+import com.mysql.cj.util.StringUtils;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -62,6 +61,8 @@ public class ExamRecordForMarkingCloudServiceProvider extends ControllerSupport
     private ExamStudentRepo examStudentRepo;
     @Autowired
     private ExamRecordDataRepo examRecordDataRepo;
+    @Autowired
+    private ExamRecordForMarkingRepo examRecordForMarkingRepo;
 
     @Override
     @ApiOperation(value = "根据条件查询阅卷需要的信息")
@@ -259,6 +260,19 @@ public class ExamRecordForMarkingCloudServiceProvider extends ControllerSupport
         resp.setData(data);
         return resp;
     }
-
+    @Override
+    @PostMapping("/updateExamRecordForMarkingBatchNum")
+    public void updateExamRecordForMarkingBatchNum(@RequestBody UpdateExamRecordForMarkingBatchNumReq req) {
+        if (req.getIdList()==null || req.getIdList().isEmpty()){
+            throw new StatusException("222001","阅卷原始数据表id不允许为空");
+        }
+        if (req.getIdList().size()>100){
+            throw new StatusException("222002","阅卷原始数据表id集合最大不得超过100条");
+        }
+        if (StringUtils.isNullOrEmpty(req.getBatchNum())){
+            throw new StatusException("222003","批次号不允许为空");
+        }
+        examRecordForMarkingRepo.updateBatchNum(req.getIdList(),req.getBatchNum());
+    }
 
 }

+ 0 - 18
examcloud-core-oe-admin-dao/src/main/java/cn/com/qmth/examcloud/core/oe/admin/dao/ExamQuestionPlayTimeRepo.java

@@ -1,18 +0,0 @@
-package cn.com.qmth.examcloud.core.oe.admin.dao;
-
-import java.util.List;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
-import org.springframework.stereotype.Repository;
-
-import cn.com.qmth.examcloud.core.oe.admin.dao.entity.ExamQuestionPlayTime;
-
-
-@Repository
-public interface ExamQuestionPlayTimeRepo extends JpaRepository<ExamQuestionPlayTime, Long>, JpaSpecificationExecutor<ExamQuestionPlayTime> {
-
-	public ExamQuestionPlayTime findByExamRecordDataIdAndMediaName(Long examRecordDataId,String mediaName);
-	
-	public List<ExamQuestionPlayTime> findByExamRecordDataIdAndQuestionOrder(Long examRecordDataId,Integer questionOrder);
-}

+ 0 - 88
examcloud-core-oe-admin-dao/src/main/java/cn/com/qmth/examcloud/core/oe/admin/dao/entity/ExamQuestionPlayTime.java

@@ -1,88 +0,0 @@
-package cn.com.qmth.examcloud.core.oe.admin.dao.entity;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.Table;
-
-import cn.com.qmth.examcloud.web.jpa.JpaEntity;
-
-/**
- * 
- * @author  	chenken
- * @date    	2018年9月25日 下午3:25:30
- * @company 	QMTH
- * @description	音频播放次数
- */
-@Entity
-@Table(name="ec_oe_exam_question_playtime")
-public class ExamQuestionPlayTime extends JpaEntity{
-
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 7994848288118975942L;
-
-	@Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
-	private Long id;
-	
-	/**
-	 * 考试记录ID
-	 */
-	private Long examRecordDataId;
-	/**
-	 * 试题Order
-	 */
-	private Integer questionOrder;
-	/**
-	 * 媒体文件名称
-	 */
-	private String mediaName;
-	/**
-	 * 播放次数
-	 */
-	private Integer playTimes;
-
-	public Long getId() {
-		return id;
-	}
-
-	public void setId(Long id) {
-		this.id = id;
-	}
-
-	public Long getExamRecordDataId() {
-		return examRecordDataId;
-	}
-
-	public void setExamRecordDataId(Long examRecordDataId) {
-		this.examRecordDataId = examRecordDataId;
-	}
-
-	public Integer getQuestionOrder() {
-		return questionOrder;
-	}
-
-	public void setQuestionOrder(Integer questionOrder) {
-		this.questionOrder = questionOrder;
-	}
-
-	public String getMediaName() {
-		return mediaName;
-	}
-
-	public void setMediaName(String mediaName) {
-		this.mediaName = mediaName;
-	}
-
-	public Integer getPlayTimes() {
-		return playTimes;
-	}
-
-	public void setPlayTimes(Integer playTimes) {
-		this.playTimes = playTimes;
-	}
-	
-}

+ 35 - 3
examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/ExamRecordQuestionsService.java

@@ -3,7 +3,11 @@ package cn.com.qmth.examcloud.core.oe.admin.service;
 import java.util.List;
 
 import cn.com.qmth.examcloud.core.oe.admin.dao.entity.ExamQuestionEntity;
+import cn.com.qmth.examcloud.core.oe.admin.dao.entity.ExamRecordDataEntity;
+import cn.com.qmth.examcloud.core.oe.admin.dao.entity.ExamRecordQuestionsEntity;
+import cn.com.qmth.examcloud.core.oe.admin.service.bean.ExamStudentQuestionInfo;
 import cn.com.qmth.examcloud.core.oe.admin.service.bean.SubjectiveQuestionScoreInfo;
+import cn.com.qmth.examcloud.question.commons.core.paper.DefaultPaper;
 
 public interface ExamRecordQuestionsService {
 
@@ -12,12 +16,40 @@ public interface ExamRecordQuestionsService {
 	 * @param examRecordDataId	考试记录ID
 	 * @return
 	 */
-	public List<ExamQuestionEntity> querySubjectiveAnswerList(Long examRecordDataId);
+	List<ExamQuestionEntity> querySubjectiveAnswerList(Long examRecordDataId);
 	
 	/**
 	 * 保存主观题得分
 	 * @param subjectiveQuestionScoreInfoList
 	 */
-	public void saveSubjectiveQuestionScore(Long examRecordDataId,List<SubjectiveQuestionScoreInfo> subjectiveQuestionScoreInfoList);
-	
+	void saveSubjectiveQuestionScore(Long examRecordDataId, List<SubjectiveQuestionScoreInfo> subjectiveQuestionScoreInfoList);
+
+	/**
+	 * 计算主观题作答总长度
+	 * @param examRecordDataId
+	 * @return
+	 */
+	Integer calculationSubjectiveAnswerLength(Long examRecordDataId);
+
+	/**
+	 * 初始化ExamQuestion
+	 * @param examRecordDataId
+	 * @param paperStructByReorder
+	 */
+	ExamRecordQuestionsEntity createExamRecordQuestions(Long examRecordDataId, DefaultPaper paperStructByReorder);
+
+	/**
+	 * 获取考试作答记录并修复考试记录表的数据(如有必要)
+	 * @param examRecordData 考试记录
+	 * @return
+	 */
+	ExamRecordQuestionsEntity getExamRecordQuestionsAndFixExamRecordDataIfNecessary(ExamRecordDataEntity examRecordData);
+
+	/**
+	 *  获取考试作答记录并修复考试记录表的数据(如有必要)
+	 * @param examRecordDataId 考试记录id
+	 * @return
+	 */
+	ExamRecordQuestionsEntity getExamRecordQuestionsAndFixExamRecordDataIfNecessary(Long examRecordDataId);
+
 }

+ 88 - 0
examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/bean/ExamStudentQuestionInfo.java

@@ -0,0 +1,88 @@
+package cn.com.qmth.examcloud.core.oe.admin.service.bean;
+
+import cn.com.qmth.examcloud.api.commons.exchange.JsonSerializable;
+import cn.com.qmth.examcloud.question.commons.core.question.AnswerType;
+
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+
+/**
+ * 
+ * @author  	chenken
+ * @date    	2018年9月25日 上午9:43:19
+ * @company 	QMTH
+ * @description 考生作答信息 
+ */
+public class ExamStudentQuestionInfo implements JsonSerializable {
+	
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 8080615797817377990L;
+
+	/**
+	 * 题目序号
+	 */
+	private Integer order;
+	
+	/**
+	 * 是否标记
+	 */
+	private Boolean isSign;
+	
+	/**
+	 * 考生作答
+	 */
+	private String studentAnswer;
+	
+	/**
+	 * 音频播放次数
+	 */
+	private String audioPlayTimes;
+	/**
+	 * 题目作答类型
+	 */
+	@Enumerated(EnumType.STRING)
+	private AnswerType answerType;
+
+	public Integer getOrder() {
+		return order;
+	}
+
+	public void setOrder(Integer order) {
+		this.order = order;
+	}
+
+	public String getStudentAnswer() {
+		return studentAnswer;
+	}
+
+	public void setStudentAnswer(String studentAnswer) {
+		this.studentAnswer = studentAnswer;
+	}
+
+	public Boolean getIsSign() {
+		return isSign;
+	}
+
+	public void setIsSign(Boolean isSign) {
+		this.isSign = isSign;
+	}
+
+	public String getAudioPlayTimes() {
+		return audioPlayTimes;
+	}
+
+	public void setAudioPlayTimes(String audioPlayTimes) {
+		this.audioPlayTimes = audioPlayTimes;
+	}
+
+	public AnswerType getAnswerType() {
+		return answerType;
+	}
+
+	public void setAnswerType(AnswerType answerType) {
+		this.answerType = answerType;
+	}
+	
+}

+ 19 - 20
examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/impl/ExamAuditServiceImpl.java

@@ -22,16 +22,9 @@ import cn.com.qmth.examcloud.core.oe.admin.dao.entity.ExamRecordDataEntity;
 import cn.com.qmth.examcloud.core.oe.admin.dao.entity.ExamRecordForMarkingEntity;
 import cn.com.qmth.examcloud.core.oe.admin.dao.entity.ExamScoreEntity;
 import cn.com.qmth.examcloud.core.oe.admin.dao.enums.*;
-import cn.com.qmth.examcloud.core.oe.admin.service.ExamAuditService;
-import cn.com.qmth.examcloud.core.oe.admin.service.ExamScoreObtainQueueService;
-import cn.com.qmth.examcloud.core.oe.admin.service.ExamScorePushQueueService;
-import cn.com.qmth.examcloud.core.oe.admin.service.ExamService;
-import cn.com.qmth.examcloud.core.oe.admin.service.GainBaseDataService;
-import cn.com.qmth.examcloud.core.oe.admin.service.LocalCacheService;
+import cn.com.qmth.examcloud.core.oe.admin.service.*;
 import cn.com.qmth.examcloud.core.oe.admin.service.bean.examaudit.*;
 import cn.com.qmth.examcloud.core.oe.admin.service.others.ExamCacheTransferHelper;
-import cn.com.qmth.examcloud.core.oe.student.api.OeExamRecordForMarkingCloudService;
-import cn.com.qmth.examcloud.core.oe.student.api.request.SaveExamRecordForMarkingReq;
 import cn.com.qmth.examcloud.examwork.api.bean.ExamBean;
 import cn.com.qmth.examcloud.marking.api.MarkWorkCloudService;
 import cn.com.qmth.examcloud.marking.api.request.AppendMarkWorkPaperReq;
@@ -71,12 +64,11 @@ public class ExamAuditServiceImpl implements ExamAuditService {
     private ExamScoreRepo examScoreRepo;
     @Autowired
     private EntityManager entityManager;
-    @Autowired
-    private ExamService examService;
+
     @Autowired
     private ExamRecordDataRepo examRecordDataRepo;
     @Autowired
-    private OeExamRecordForMarkingCloudService oeExamRecordForMarkingCloudService;
+    private ExamRecordQuestionsService examRecordQuestionsService;
 	@Autowired
 	private ExamRecordForMarkingRepo examRecordForMarkingRepo;
     @Autowired
@@ -298,15 +290,22 @@ public class ExamAuditServiceImpl implements ExamAuditService {
 	 */
 	private void saveExamRecordForMarkingWithAudit(ExamRecordDataEntity examRecordData,ExamScoreEntity examScore){
     	if(examRecordData.getIsAllObjectivePaper() != null && !examRecordData.getIsAllObjectivePaper()){
-    		SaveExamRecordForMarkingReq req = new SaveExamRecordForMarkingReq();
-    		req.setExamRecordDataId(examRecordData.getId());
-    		req.setExamId(examRecordData.getExamId());
-    		req.setExamStudentId(examRecordData.getExamStudentId());
-    		req.setPaperType(examRecordData.getPaperType());
-    		req.setBasePaperId(examRecordData.getBasePaperId());
-    		req.setCourseId(examRecordData.getCourseId());
-    		req.setObjectiveScore(examScore.getObjectiveScore());
-    		oeExamRecordForMarkingCloudService.saveExamRecordForMarking(req);
+            ExamRecordForMarkingEntity examRecordForMarkingExists =
+                    examRecordForMarkingRepo.findByExamRecordDataId(examRecordData.getId());
+            if (examRecordForMarkingExists != null) {
+                return;
+            }
+            ExamRecordForMarkingEntity examRecordForMarking = new ExamRecordForMarkingEntity();
+            examRecordForMarking.setExamId(examRecordData.getExamId());
+            examRecordForMarking.setExamRecordDataId(examRecordData.getId());
+            examRecordForMarking.setExamStudentId(examRecordData.getExamStudentId());
+            examRecordForMarking.setBasePaperId(examRecordData.getBasePaperId());
+            examRecordForMarking.setPaperType(examRecordData.getPaperType());
+            examRecordForMarking.setCourseId(examRecordData.getCourseId());
+            examRecordForMarking.setObjectiveScore(examScore.getObjectiveScore());
+            int subjectiveAnswerLength = examRecordQuestionsService.calculationSubjectiveAnswerLength(examRecordData.getId());
+            examRecordForMarking.setSubjectiveAnswerLength(subjectiveAnswerLength);
+            examRecordForMarkingRepo.save(examRecordForMarking);
 
     		//调用阅卷接口,通知有新数据
             AppendMarkWorkPaperReq appendMarkWorkPaperReq = new AppendMarkWorkPaperReq();

+ 116 - 0
examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/impl/ExamRecordQuestionsServiceImpl.java

@@ -1,5 +1,6 @@
 package cn.com.qmth.examcloud.core.oe.admin.service.impl;
 
+import cn.com.qmth.examcloud.commons.exception.StatusException;
 import cn.com.qmth.examcloud.core.oe.admin.base.utils.QuestionTypeUtil;
 import cn.com.qmth.examcloud.core.oe.admin.dao.ExamRecordDataRepo;
 import cn.com.qmth.examcloud.core.oe.admin.dao.ExamRecordQuestionsRepo;
@@ -12,11 +13,23 @@ import cn.com.qmth.examcloud.core.oe.admin.dao.enums.ExamType;
 import cn.com.qmth.examcloud.core.oe.admin.service.ExamRecordQuestionsService;
 import cn.com.qmth.examcloud.core.oe.admin.service.ExamStudentFinalScoreService;
 import cn.com.qmth.examcloud.core.oe.admin.service.bean.SubjectiveQuestionScoreInfo;
+import cn.com.qmth.examcloud.core.questions.api.ExtractConfigCloudService;
+import cn.com.qmth.examcloud.question.commons.core.paper.DefaultPaper;
+import cn.com.qmth.examcloud.question.commons.core.paper.DefaultQuestionGroup;
+import cn.com.qmth.examcloud.question.commons.core.paper.DefaultQuestionStructureWrapper;
+import cn.com.qmth.examcloud.question.commons.core.paper.DefaultQuestionUnitWrapper;
 import cn.com.qmth.examcloud.web.helpers.GlobalHelper;
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheBuilder;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 @Service("examRecordQuestionsService")
@@ -31,6 +44,17 @@ public class ExamRecordQuestionsServiceImpl implements ExamRecordQuestionsServic
     @Autowired
     private ExamScoreRepo examScoreRepo;
 
+    @Autowired
+    private RedisTemplate<String, Object> redisTemplate;
+
+    @Autowired
+    private ExtractConfigCloudService extractConfigCloudService;
+
+
+    //本地题干缓存,最大200道题,默认缓存120秒
+    private Cache<String, String> questionContentCache = CacheBuilder.newBuilder().maximumSize(200)
+            .expireAfterWrite(120, TimeUnit.SECONDS).build();
+
     @Autowired
     private ExamStudentFinalScoreService examStudentFinalScoreService;
 
@@ -79,4 +103,96 @@ public class ExamRecordQuestionsServiceImpl implements ExamRecordQuestionsServic
         examStudentFinalScoreService.calculateFinalScore(examRecordData.getExamStudentId());
     }
 
+    @Override
+    public Integer calculationSubjectiveAnswerLength(Long examRecordDataId) {
+        ExamRecordQuestionsEntity examRecordQuesitonsEntity = getExamRecordQuestionsAndFixExamRecordDataIfNecessary(examRecordDataId);
+        if (examRecordQuesitonsEntity == null || examRecordQuesitonsEntity.getExamQuestionEntities() == null ||
+                examRecordQuesitonsEntity.getExamQuestionEntities().isEmpty()) {
+            return 0;
+        }
+        List<ExamQuestionEntity> examQuestionList = examRecordQuesitonsEntity.getExamQuestionEntities();
+
+        int answerLength = 0;
+        for (ExamQuestionEntity examQuestionEntity : examQuestionList) {
+            if (!QuestionTypeUtil.isObjectiveQuestion(examQuestionEntity.getQuestionType())
+                    && examQuestionEntity.getStudentAnswer() != null) {
+                answerLength += examQuestionEntity.getStudentAnswer().length();
+            }
+        }
+        return answerLength;
+    }
+
+    @Override
+    public ExamRecordQuestionsEntity createExamRecordQuestions(Long examRecordDataId, DefaultPaper defaultPaper) {
+        ExamRecordQuestionsEntity examRecordQuestionsEntity = new ExamRecordQuestionsEntity();
+
+        List<ExamQuestionEntity> examQuestionEntityList = new ArrayList<ExamQuestionEntity>();
+        List<DefaultQuestionGroup> defaultQuestionGroups = defaultPaper.getQuestionGroupList();
+        int order = 0;
+        for (int i = 0; i < defaultQuestionGroups.size(); i++) {
+            DefaultQuestionGroup defaultQuestionGroup = defaultQuestionGroups.get(i);
+            List<DefaultQuestionStructureWrapper> defaultQuestionStructureWrappers = defaultQuestionGroup.getQuestionWrapperList();
+            for (DefaultQuestionStructureWrapper defaultQuestionStructureWrapper : defaultQuestionStructureWrappers) {
+                List<DefaultQuestionUnitWrapper> questionUnitWrapperList = defaultQuestionStructureWrapper.getQuestionUnitWrapperList();
+                for (DefaultQuestionUnitWrapper defaultQuestionUnitWrapper : questionUnitWrapperList) {
+                    ExamQuestionEntity examQuestionEntity = new ExamQuestionEntity();
+                    examQuestionEntity.setExamRecordDataId(examRecordDataId);
+                    examQuestionEntity.setMainNumber(i + 1);
+                    examQuestionEntity.setOrder(++order);
+                    examQuestionEntity.setQuestionId(defaultQuestionStructureWrapper.getQuestionId());
+                    examQuestionEntity.setQuestionScore(defaultQuestionUnitWrapper.getQuestionScore());
+                    examQuestionEntity.setQuestionType(defaultQuestionUnitWrapper.getQuestionType());
+                    examQuestionEntity.setOptionPermutation(defaultQuestionUnitWrapper.getOptionPermutation());
+                    examQuestionEntity.setAudioPlayTimes(null);
+                    examQuestionEntity.setAnswerType(defaultQuestionUnitWrapper.getAnswerType());
+
+                    examQuestionEntityList.add(examQuestionEntity);
+                }
+            }
+        }
+
+        examRecordQuestionsEntity.setExamQuestionEntities(examQuestionEntityList);
+        examRecordQuestionsEntity.setExamRecordDataId(examRecordDataId);
+        examRecordQuestionsEntity.setCreationTime(new Date());
+        ExamRecordQuestionsEntity saveResult = examRecordQuestionsRepo.save(examRecordQuestionsEntity);
+//        redisTemplate.opsForList().leftPushAll(examQuestionKeyPrefix+examRecordDataId,examQuestionEntityList);
+        return saveResult;
+    }
+
+    /**
+     * 获取考试作答记录并修复考试记录数据(如有必要)
+     *
+     * @param examRecordData 考试记录
+     * @return
+     */
+    @Override
+    public ExamRecordQuestionsEntity getExamRecordQuestionsAndFixExamRecordDataIfNecessary(ExamRecordDataEntity examRecordData) {
+        if (examRecordData == null) {
+            throw new StatusException("201101", "examRecordData参数不允许为空");
+        }
+        Long examRecordDataId = examRecordData.getId();
+        String examRecordQuestionId = examRecordData.getExamRecordQuestionsId();
+
+        //如果考试作答记录id不为空,则根据id查询考试作答记录
+        if (StringUtils.isNotEmpty(examRecordQuestionId)) {
+            return GlobalHelper.getEntity(examRecordQuestionsRepo, examRecordQuestionId,
+                    ExamRecordQuestionsEntity.class);
+        }
+        //如果考试作答记录id为空,则根据考试记录id获取考试作答记录,并将考试作答记录id保存至examRecordData表中
+        else {
+            ExamRecordQuestionsEntity examRecordQuestionsEntity = examRecordQuestionsRepo.findByExamRecordDataId(examRecordDataId);
+
+            //将考试作答记录id保存至examRecordData表中,目的:纠正历史数据
+            examRecordDataRepo.updateExamRecordDataQuestionIdById(examRecordQuestionsEntity.getId(), examRecordData.getId());
+            return examRecordQuestionsEntity;
+        }
+    }
+
+    @Override
+    public ExamRecordQuestionsEntity getExamRecordQuestionsAndFixExamRecordDataIfNecessary(Long examRecordDataId) {
+        ExamRecordDataEntity examRecordData = GlobalHelper.getEntity(examRecordDataRepo,
+                examRecordDataId, ExamRecordDataEntity.class);
+        return getExamRecordQuestionsAndFixExamRecordDataIfNecessary(examRecordData);
+    }
+
 }