瀏覽代碼

网考练习代码重构

lideyin 5 年之前
父節點
當前提交
a09bccdc46

+ 62 - 53
examcloud-core-oe-admin-api-provider/src/main/java/cn/com/qmth/examcloud/core/oe/admin/api/controller/PracticeController.java

@@ -1,73 +1,82 @@
 package cn.com.qmth.examcloud.core.oe.admin.api.controller;
 
-import java.util.List;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
-
 import cn.com.qmth.examcloud.api.commons.security.bean.User;
 import cn.com.qmth.examcloud.core.oe.admin.base.utils.Check;
 import cn.com.qmth.examcloud.core.oe.admin.service.PracticeService;
 import cn.com.qmth.examcloud.core.oe.admin.service.bean.PracticeCourseInfo;
 import cn.com.qmth.examcloud.core.oe.admin.service.bean.PracticeDetailInfo;
 import cn.com.qmth.examcloud.core.oe.admin.service.bean.PracticeRecordInfo;
+import cn.com.qmth.examcloud.support.enums.DbType;
 import cn.com.qmth.examcloud.web.support.ControllerSupport;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
 
 /**
- * 
- * @author  	chenken
- * @date    	2018年9月7日 上午11:12:28
- * @company 	QMTH
+ * @author chenken
+ * @date 2018年9月7日 上午11:12:28
+ * @company QMTH
  * @description PracticeController.java
  */
 @Api(tags = "练习相关接口")
 @RestController
 @RequestMapping("${$rmp.ctr.oe}/practice")
-public class PracticeController extends ControllerSupport{
+public class PracticeController extends ControllerSupport {
+
+    @Autowired
+    private PracticeService practiceService;
+
+    /**
+     * 练习课程列表
+     *
+     * @param examId
+     * @return
+     */
+    @ApiOperation(value = "练习课程列表")
+    @GetMapping("/queryPracticeCourseList")
+    public List<PracticeCourseInfo> queryPracticeCourseList(@RequestParam Long examId) {
+        Check.isNull(examId, "examId不能为空");
+        User user = getAccessUser();
+        return practiceService.queryPracticeCourseList(examId, user.getUserId());
+    }
+
+    /**
+     * 课程练习记录详情
+     *
+     * @param examStudentId
+     * @return
+     */
+    @ApiOperation(value = "课程练习记录详情")
+    @GetMapping("/queryPracticeRecordList")
+    public List<PracticeRecordInfo> queryPracticeRecordList(@RequestParam Long examStudentId) {
+        Check.isNull(examStudentId, "examStudentId不能为空");
+        return practiceService.queryPracticeRecordList(examStudentId);
+    }
+
+    /**
+     * 单次练习答题情况统计
+     *
+     * @return
+     */
+    @ApiOperation(value = "单次练习答题情况统计")
+    @GetMapping("/getPracticeDetailInfo")
+    public PracticeDetailInfo getPracticeDetailInfo(@ApiParam("考试记录id") @RequestParam Long examRecordDataId,
+                                                    @ApiParam("数据类型(TABLE(默认值)/CACHE/COLLECTION)") @RequestParam(required = false) String dbType) {
+        Check.isNull(examRecordDataId, "examRecordDataId不能为空");
+
+        if (StringUtils.isBlank(dbType)) {
+            return practiceService.getPracticeDetailInfo(examRecordDataId, DbType.TABLE);
+        }
+
+        return practiceService.getPracticeDetailInfo(examRecordDataId, DbType.valueOf(dbType));
+    }
 
-	@Autowired
-	private PracticeService practiceService;
-	
-	/**
-	 * 练习课程列表
-	 * @param examId
-	 * @param studentId
-	 * @return
-	 */
-	@ApiOperation(value = "练习课程列表")
-	@GetMapping("/queryPracticeCourseList")
-	public List<PracticeCourseInfo> queryPracticeCourseList(@RequestParam Long examId){
-		Check.isNull(examId, "examId不能为空");
-		User user = getAccessUser();
-		return practiceService.queryPracticeCourseList(examId, user.getUserId());
-	}
-	
-	/**
-	 * 课程练习记录详情
-	 * @param examStudentId
-	 * @return
-	 */
-	@ApiOperation(value = "课程练习记录详情")
-	@GetMapping("/queryPracticeRecordList")
-	public List<PracticeRecordInfo> queryPracticeRecordList(@RequestParam Long examStudentId){
-		Check.isNull(examStudentId, "examStudentId不能为空");
-		return practiceService.queryPracticeRecordList(examStudentId);
-	}
-	
-	/**
-	 * 单次练习答题情况统计
-	 * @return
-	 */
-	@ApiOperation(value = "单次练习答题情况统计")
-	@GetMapping("/getPracticeDetailInfo")
-	public PracticeDetailInfo getPracticeDetailInfo(@RequestParam Long examRecordDataId){
-		Check.isNull(examRecordDataId, "examRecordDataId不能为空");
-		return practiceService.getPracticeDetailInfo(examRecordDataId);
-	}
-	
 }

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

@@ -5,6 +5,7 @@ import java.util.List;
 import cn.com.qmth.examcloud.core.oe.admin.service.bean.PracticeCourseInfo;
 import cn.com.qmth.examcloud.core.oe.admin.service.bean.PracticeDetailInfo;
 import cn.com.qmth.examcloud.core.oe.admin.service.bean.PracticeRecordInfo;
+import cn.com.qmth.examcloud.support.enums.DbType;
 
 /**
  * 
@@ -21,18 +22,19 @@ public interface PracticeService {
 	 * @param studentId
 	 * @return
 	 */
-	public List<PracticeCourseInfo> queryPracticeCourseList(Long examId,Long studentId);
+	List<PracticeCourseInfo> queryPracticeCourseList(Long examId, Long studentId);
 	
 	/**
 	 * 课程练习记录详情
 	 * @param examStudentId
 	 * @return
 	 */
-	public List<PracticeRecordInfo> queryPracticeRecordList(Long examStudentId);
+	List<PracticeRecordInfo> queryPracticeRecordList(Long examStudentId);
 	
 	/**
 	 * 单次练习答题情况统计
 	 * @return
 	 */
-	public PracticeDetailInfo getPracticeDetailInfo(Long examRecordDataId);
+	PracticeDetailInfo getPracticeDetailInfo(Long examRecordDataId, DbType dbType);
+
 }

+ 236 - 81
examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/impl/PracticeServiceImpl.java

@@ -1,25 +1,13 @@
 package cn.com.qmth.examcloud.core.oe.admin.service.impl;
 
-import java.text.DecimalFormat;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.stream.Collectors;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
+import cn.com.qmth.examcloud.commons.exception.StatusException;
 import cn.com.qmth.examcloud.core.basic.api.bean.CourseBean;
 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;
 import cn.com.qmth.examcloud.core.oe.admin.dao.ExamScoreRepo;
 import cn.com.qmth.examcloud.core.oe.admin.dao.ExamStudentRepo;
-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.ExamRecordPaperStructEntity;
-import cn.com.qmth.examcloud.core.oe.admin.dao.entity.ExamRecordQuestionsEntity;
-import cn.com.qmth.examcloud.core.oe.admin.dao.entity.ExamScoreEntity;
-import cn.com.qmth.examcloud.core.oe.admin.dao.entity.ExamStudentEntity;
+import cn.com.qmth.examcloud.core.oe.admin.dao.entity.*;
 import cn.com.qmth.examcloud.core.oe.admin.dao.enums.ExamRecordStatus;
 import cn.com.qmth.examcloud.core.oe.admin.service.ExamRecordPaperStructService;
 import cn.com.qmth.examcloud.core.oe.admin.service.PracticeService;
@@ -31,7 +19,20 @@ import cn.com.qmth.examcloud.core.oe.admin.service.others.ExamCacheTransferHelpe
 import cn.com.qmth.examcloud.examwork.api.bean.ExamBean;
 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.support.enums.DbType;
+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.redis.RedisKeyHelper;
 import cn.com.qmth.examcloud.web.helpers.GlobalHelper;
+import cn.com.qmth.examcloud.web.redis.RedisClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.text.DecimalFormat;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
 
 
 /**
@@ -58,6 +59,9 @@ public class PracticeServiceImpl implements PracticeService {
     @Autowired
     private ExamRecordPaperStructService examRecordPaperStructService;
 
+    @Autowired
+    private RedisClient redisClient;
+
     @Override
     public List<PracticeCourseInfo> queryPracticeCourseList(Long examId, Long studentId) {
         if (examId == null || studentId == null) {
@@ -68,13 +72,127 @@ public class PracticeServiceImpl implements PracticeService {
             return null;
         }
         List<PracticeCourseInfo> practiceCourseInfos = new ArrayList<PracticeCourseInfo>();
-        ExamBean examBean = ExamCacheTransferHelper.getCachedExam(examId,studentId);
+        ExamBean examBean = ExamCacheTransferHelper.getCachedExam(examId, studentId);
         for (ExamStudentEntity examStudent : examStudentList) {
             practiceCourseInfos.add(buildPracticeCourseInfo(examStudent, examBean));
         }
         return practiceCourseInfos;
     }
 
+    @Override
+    public List<PracticeRecordInfo> queryPracticeRecordList(Long examStudentId) {
+        if (examStudentId == null) {
+            return null;
+        }
+        List<ExamRecordDataEntity> examRecordDataList = examRecordDataRepo.findByExamStudentId(examStudentId);
+        List<PracticeRecordInfo> practiceRecords = new ArrayList<PracticeRecordInfo>();
+        ExamStudentEntity examStudent = examStudentRepo.findByExamStudentId(examStudentId);
+        CourseBean courseBean = ExamCacheTransferHelper.getCachedCourse(examStudent.getCourseId());
+        for (ExamRecordDataEntity examRecordData : examRecordDataList) {
+            if (examRecordData.getExamRecordStatus() != ExamRecordStatus.EXAM_ING) {
+                practiceRecords.add(buildPracticeRecord(examRecordData, courseBean));
+            }
+        }
+        return practiceRecords;
+    }
+
+    @Override
+    public PracticeDetailInfo getPracticeDetailInfo(Long examRecordDataId, DbType dbType) {
+        if (examRecordDataId == null) {
+            return null;
+        }
+
+        //----根据数据类型获取试卷结构
+        DefaultPaper defaultPaper = this.getDefaultPaper(examRecordDataId, dbType);
+
+        List<DefaultQuestionGroup> questionGroupList = defaultPaper.getQuestionGroupList();
+
+        //----根据数据类型获取作答记录
+        List<ExamQuestion> examQuestionList = getPartialExamQuestionList(examRecordDataId, dbType);
+
+        //遍历大题
+        int objectiveNum = 0;//各个大题中的客观题总数
+        int objectSuccessNum = 0;//各个大题中的客观题答对的总数量
+
+        List<PaperStructInfo> paperStructInfos = new ArrayList<PaperStructInfo>();
+
+        for (int i = 0; i < questionGroupList.size(); i++) {
+            DefaultQuestionGroup defaultQuestionGroup = questionGroupList.get(i);
+            PaperStructInfo paperStructInfo = new PaperStructInfo();
+            paperStructInfo.setTitle(defaultQuestionGroup.getGroupName());//大题名称
+            paperStructInfo.setIndex(i + 1);//大题号
+            //使用大题号过滤
+            List<ExamQuestion> examQuestionEntitiesOfMainQuestion = examQuestionList.stream().filter(o1 -> o1.getMainNumber().intValue() == paperStructInfo.getIndex()).collect(Collectors.toList());
+            //计算出作答情况
+            PracticeRecordInfo practiceRecordInfo = calculationExamQuestionSituationInfo(null, examQuestionEntitiesOfMainQuestion);
+
+            objectiveNum += practiceRecordInfo.getObjectiveNum();
+            objectSuccessNum += practiceRecordInfo.getSuccQuestionNum();
+
+            paperStructInfo.setQuestionCount(practiceRecordInfo.getTotalQuestionCount());
+            paperStructInfo.setSuccQuestionNum(practiceRecordInfo.getSuccQuestionNum());
+            paperStructInfo.setFailQuestionNum(practiceRecordInfo.getFailQuestionNum());
+            paperStructInfo.setNotAnsweredCount(practiceRecordInfo.getNotAnsweredCount());
+            paperStructInfos.add(paperStructInfo);
+        }
+
+        PracticeDetailInfo practiceDetailInfo = new PracticeDetailInfo();
+
+        practiceDetailInfo.setPaperStructInfos(paperStructInfos);
+
+        //----根据考试记录id获取课程id
+        Long courseId = getCourseId(examRecordDataId, dbType);
+
+        CourseBean courseBean = ExamCacheTransferHelper.getCachedCourse(courseId);
+        practiceDetailInfo.setCourseCode(courseBean.getCode());
+        practiceDetailInfo.setCourseName(courseBean.getName());
+        practiceDetailInfo.setId(examRecordDataId);
+
+        double objectiveAccuracy = 0;//客观题答题正确率
+        if (objectiveNum > 0) {
+            objectiveAccuracy = Double.valueOf(new DecimalFormat("#.00").format(objectSuccessNum * 100D / objectiveNum));
+        }
+        practiceDetailInfo.setObjectiveAccuracy(objectiveAccuracy);
+
+        return practiceDetailInfo;
+    }
+
+    /**
+     * 根据数据类型获取课程id
+     *
+     * @param examRecordDataId
+     * @param dbType
+     * @return
+     */
+    private Long getCourseId(Long examRecordDataId, DbType dbType) {
+        Long courseId = null;
+
+        //如果数据类型为缓存数据,从缓存中获取
+        if (DbType.CACHE == dbType) {
+            ExamRecordData examRecordData =
+                    redisClient.get(RedisKeyHelper.getBuilder().examRecordDataKey(examRecordDataId), ExamRecordData.class);
+
+            if (null != examRecordData) {
+                courseId = examRecordData.getCourseId();
+                return courseId;
+            }
+        }
+
+        //缓存中未获取到或指定从数据库中取,则从数据库中获取
+        if (DbType.TABLE==dbType || null == courseId) {
+            ExamRecordDataEntity examRecordData =
+                    GlobalHelper.getEntity(examRecordDataRepo, examRecordDataId, ExamRecordDataEntity.class);
+
+            if (null == examRecordData) {
+                throw new StatusException("100101","找不到考试记录相关数据");
+            }
+
+            return examRecordData.getId();
+        }
+
+        throw new StatusException("100003", "暂不支持的数据类型");
+
+    }
 
     private PracticeCourseInfo buildPracticeCourseInfo(ExamStudentEntity examStudent, ExamBean examBean) {
         PracticeCourseInfo practiceCourseInfo = new PracticeCourseInfo();
@@ -132,23 +250,6 @@ public class PracticeServiceImpl implements PracticeService {
         return practiceCourseInfo;
     }
 
-    @Override
-    public List<PracticeRecordInfo> queryPracticeRecordList(Long examStudentId) {
-        if (examStudentId == null) {
-            return null;
-        }
-        List<ExamRecordDataEntity> examRecordDataList = examRecordDataRepo.findByExamStudentId(examStudentId);
-        List<PracticeRecordInfo> practiceRecords = new ArrayList<PracticeRecordInfo>();
-        ExamStudentEntity examStudent = examStudentRepo.findByExamStudentId(examStudentId);
-        CourseBean courseBean = ExamCacheTransferHelper.getCachedCourse(examStudent.getCourseId());
-        for (ExamRecordDataEntity examRecordData : examRecordDataList) {
-            if (examRecordData.getExamRecordStatus() != ExamRecordStatus.EXAM_ING) {
-                practiceRecords.add(buildPracticeRecord(examRecordData, courseBean));
-            }
-        }
-        return practiceRecords;
-    }
-
     private PracticeRecordInfo buildPracticeRecord(ExamRecordDataEntity examRecordData, CourseBean courseBean) {
         PracticeRecordInfo practiceRecordInfo = new PracticeRecordInfo();
 
@@ -163,7 +264,7 @@ public class PracticeServiceImpl implements PracticeService {
         practiceRecordInfo.setObjectiveAccuracy(examScoreEntity.getObjectiveAccuracy());//客观题答对的比率
         ExamRecordQuestionsEntity examRecordQuestions = examRecordQuestionsRepo.findByExamRecordDataId(examRecordData.getId());
         List<ExamQuestionEntity> examQuestionEntities = examRecordQuestions.getExamQuestionEntities();
-        practiceRecordInfo = calculationExamQuestionSituationInfo(practiceRecordInfo, examQuestionEntities);
+        practiceRecordInfo = calculationExamQuestionSituationInfo(practiceRecordInfo, copyFromEntityList(examQuestionEntities));
 
         return practiceRecordInfo;
     }
@@ -172,17 +273,18 @@ public class PracticeServiceImpl implements PracticeService {
      * 计算答题情况
      *
      * @param practiceRecordInfo
-     * @param examQuestionEntities
+     * @param examQuestionList
      * @return
      */
-    private PracticeRecordInfo calculationExamQuestionSituationInfo(PracticeRecordInfo practiceRecordInfo, List<ExamQuestionEntity> examQuestionEntities) {
+    private PracticeRecordInfo calculationExamQuestionSituationInfo(PracticeRecordInfo practiceRecordInfo,
+                                                                    List<ExamQuestion> examQuestionList) {
         if (practiceRecordInfo == null) {
             practiceRecordInfo = new PracticeRecordInfo();
         }
         int succQuestionNum = 0;//正确答题数
         int failQuestionNum = 0;//错误答题数
         int notAnsweredCount = 0;//未作答题数
-        for (ExamQuestionEntity examQuestionEntity : examQuestionEntities) {
+        for (ExamQuestion examQuestionEntity : examQuestionList) {
             if (examQuestionEntity.getIsAnswer() == null || !examQuestionEntity.getIsAnswer()) {
                 notAnsweredCount++;
             } else {
@@ -199,7 +301,7 @@ public class PracticeServiceImpl implements PracticeService {
             }
         }
         int objectiveQuestionsNum = 0;//客观题总数
-        for (ExamQuestionEntity examQuestionEntity : examQuestionEntities) {
+        for (ExamQuestion examQuestionEntity : examQuestionList) {
             if (QuestionTypeUtil.isObjectiveQuestion(examQuestionEntity.getQuestionType())) {
                 objectiveQuestionsNum++;
             }
@@ -208,59 +310,112 @@ public class PracticeServiceImpl implements PracticeService {
         practiceRecordInfo.setSuccQuestionNum(succQuestionNum);
         practiceRecordInfo.setFailQuestionNum(failQuestionNum);
         practiceRecordInfo.setNotAnsweredCount(notAnsweredCount);
-        practiceRecordInfo.setTotalQuestionCount(examQuestionEntities.size());
+        practiceRecordInfo.setTotalQuestionCount(examQuestionList.size());
         return practiceRecordInfo;
     }
 
-    @Override
-    public PracticeDetailInfo getPracticeDetailInfo(Long examRecordDataId) {
-        if (examRecordDataId == null) {
-            return null;
+    /**
+     * 根据数据类型获取试卷
+     *
+     * @param examRecordDataId
+     * @param dbType
+     * @return
+     */
+    private DefaultPaper getDefaultPaper(Long examRecordDataId, DbType dbType) {
+        ExamRecordPaperStruct examRecordPaperStruct = null;
+
+        //从缓存中获取
+        if (DbType.CACHE == dbType) {
+            examRecordPaperStruct = redisClient.get(RedisKeyHelper.getBuilder().studentPaperKey(examRecordDataId),
+                    ExamRecordPaperStruct.class);
+
+            if (null != examRecordPaperStruct) {
+                return examRecordPaperStruct.getDefaultPaper();
+            }
         }
-        PracticeDetailInfo practiceDetailInfo = new PracticeDetailInfo();
-        //取出试卷结构
-        ExamRecordPaperStructEntity examRecordPaperStruct = examRecordPaperStructService.getExamRecordPaperStruct(examRecordDataId);
-        DefaultPaper defaultPaper = examRecordPaperStruct.getDefaultPaper();
-        List<PaperStructInfo> paperStructInfos = new ArrayList<PaperStructInfo>();
-        List<DefaultQuestionGroup> questionGroupList = defaultPaper.getQuestionGroupList();
-        //取出作答记录
-        ExamRecordQuestionsEntity examRecordQuestions = examRecordQuestionsRepo.findByExamRecordDataId(examRecordDataId);
-        List<ExamQuestionEntity> examQuestionEntities = examRecordQuestions.getExamQuestionEntities();
-        //遍历大题
-        int objectiveNum = 0;//各个大题中的客观题总数
-        int objectSuccessNum = 0;//各个大题中的客观题答对的总数量
-        for (int i = 0; i < questionGroupList.size(); i++) {
-            DefaultQuestionGroup defaultQuestionGroup = questionGroupList.get(i);
-            PaperStructInfo paperStructInfo = new PaperStructInfo();
-            paperStructInfo.setTitle(defaultQuestionGroup.getGroupName());//大题名称
-            paperStructInfo.setIndex(i + 1);//大题号
-            //使用大题号过滤
-            List<ExamQuestionEntity> examQuestionEntitiesOfMainQuestion = examQuestionEntities.stream().filter(o1 -> o1.getMainNumber().intValue() == paperStructInfo.getIndex()).collect(Collectors.toList());
-            //计算出作答情况
-            PracticeRecordInfo practiceRecordInfo = calculationExamQuestionSituationInfo(null, examQuestionEntitiesOfMainQuestion);
 
-            objectiveNum += practiceRecordInfo.getObjectiveNum();
-            objectSuccessNum += practiceRecordInfo.getSuccQuestionNum();
+        //如果数据类型为table或者缓存中未取到,则从数据库中获取
+        if (DbType.TABLE == dbType || null == examRecordPaperStruct) {
+            return examRecordPaperStructService.getExamRecordPaperStruct(examRecordDataId).getDefaultPaper();
+        }
 
-            paperStructInfo.setQuestionCount(practiceRecordInfo.getTotalQuestionCount());
-            paperStructInfo.setSuccQuestionNum(practiceRecordInfo.getSuccQuestionNum());
-            paperStructInfo.setFailQuestionNum(practiceRecordInfo.getFailQuestionNum());
-            paperStructInfo.setNotAnsweredCount(practiceRecordInfo.getNotAnsweredCount());
-            paperStructInfos.add(paperStructInfo);
+        throw new StatusException("100002", "暂不支持的数据类型");
+    }
+
+    /**
+     * 根据数据类型获取部分作答数据集合
+     *
+     * @param examRecordDataId
+     * @param dbType
+     * @return
+     */
+    private List<ExamQuestion> getPartialExamQuestionList(Long examRecordDataId, DbType dbType) {
+        List<ExamQuestion> examQuestionList = new ArrayList<>();
+        Integer questionCount = 0;
+
+        //从缓存中获取
+        if (DbType.CACHE == dbType) {
+            ExamRecordData examRecordData = redisClient.get(RedisKeyHelper.getBuilder().examRecordDataKey(examRecordDataId),
+                    ExamRecordData.class);
+
+            if (null != examRecordData) {
+                questionCount = examRecordData.getQuestionCount();
+
+                for (int i = 1; i <= questionCount; i++) {
+                    ExamQuestion examQuestion = redisClient.get(RedisKeyHelper.getBuilder().studentAnswerKey(examRecordDataId, i),
+                            ExamQuestion.class);
+
+                    if (null != examQuestion) {
+
+                        //由于主观题不需要参与计算,所以缓存中超长答案的情况不考虑
+                        examQuestionList.add(examQuestion);
+
+                        if (questionCount > 0 && questionCount == examQuestionList.size()) {
+                            return examQuestionList;
+                        }
+                    }
+                }
+            }
         }
-        practiceDetailInfo.setPaperStructInfos(paperStructInfos);
-        ExamRecordDataEntity examRecordData = GlobalHelper.getEntity(examRecordDataRepo, examRecordDataId, ExamRecordDataEntity.class);
-        CourseBean courseBean = ExamCacheTransferHelper.getCachedCourse(examRecordData.getCourseId());
-        practiceDetailInfo.setCourseCode(courseBean.getCode());
-        practiceDetailInfo.setCourseName(courseBean.getName());
-        practiceDetailInfo.setId(examRecordDataId);
 
-        double objectiveAccuracy = 0;//客观题答题正确率
-        if (objectiveNum > 0) {
-            objectiveAccuracy = Double.valueOf(new DecimalFormat("#.00").format(objectSuccessNum * 100D / objectiveNum));
+        //从缓存中未取到,或者指定了从数据库中取,则从数据库中获取
+        if (DbType.TABLE == dbType ||
+                (examQuestionList.isEmpty() ||
+                        (!examQuestionList.isEmpty() && questionCount.intValue() != examQuestionList.size()))) {
+
+            ExamRecordQuestionsEntity examRecordQuestions = examRecordQuestionsRepo.findByExamRecordDataId(examRecordDataId);
+            List<ExamQuestionEntity> examQuestionEntityList = examRecordQuestions.getExamQuestionEntities();
+
+            return copyFromEntityList(examQuestionEntityList);
         }
-        practiceDetailInfo.setObjectiveAccuracy(objectiveAccuracy);
-        return practiceDetailInfo;
+
+        throw new StatusException("100001", "暂不支持的数据类型");
     }
 
+    private List<ExamQuestion> copyFromEntityList(List<ExamQuestionEntity> examQuestionEntityList) {
+        List<ExamQuestion> examQuestionList = new ArrayList<>();
+
+        for (ExamQuestionEntity entity : examQuestionEntityList) {
+            ExamQuestion examQuestion = new ExamQuestion();
+            examQuestion.setExamRecordDataId(entity.getExamRecordDataId());
+            examQuestion.setMainNumber(entity.getMainNumber());
+            examQuestion.setQuestionId(entity.getQuestionId());
+            examQuestion.setOrder(entity.getOrder());
+            examQuestion.setStudentAnswer(entity.getStudentAnswer());
+            examQuestion.setStudentScore(entity.getStudentScore());
+            examQuestion.setQuestionScore(entity.getQuestionScore());
+            examQuestion.setQuestionType(entity.getQuestionType());
+            examQuestion.setIsAnswer(entity.getIsAnswer());
+            examQuestion.setIsSign(entity.getIsSign());
+            examQuestion.setCorrectAnswer(entity.getCorrectAnswer());
+            examQuestion.setOptionPermutation(entity.getOptionPermutation());
+            examQuestion.setAudioPlayTimes(entity.getAudioPlayTimes());
+            examQuestion.setAnswerType(entity.getAnswerType());
+
+            examQuestionList.add(examQuestion);
+
+        }
+
+        return examQuestionList;
+    }
 }