瀏覽代碼

练习详情页四个接口转换考试记录id

xiatian 5 年之前
父節點
當前提交
8d609a23ca

+ 12 - 1
examcloud-core-oe-admin-api-provider/src/main/java/cn/com/qmth/examcloud/core/oe/admin/api/controller/ExamRecordDataController.java

@@ -1,9 +1,11 @@
 package cn.com.qmth.examcloud.core.oe.admin.api.controller;
 
+import cn.com.qmth.examcloud.commons.exception.StatusException;
 import cn.com.qmth.examcloud.core.oe.admin.api.bean.ExamRecordDataBeanConvert;
 import cn.com.qmth.examcloud.core.oe.admin.api.bean.ExamRecordDataDomain;
 import cn.com.qmth.examcloud.core.oe.admin.dao.ExamRecordDataRepo;
 import cn.com.qmth.examcloud.core.oe.admin.dao.entity.ExamRecordDataEntity;
+import cn.com.qmth.examcloud.core.oe.admin.service.ExamRecordDataSyncService;
 import cn.com.qmth.examcloud.web.helpers.GlobalHelper;
 import io.swagger.annotations.Api;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -23,9 +25,18 @@ public class ExamRecordDataController {
 
     @Autowired
     private ExamRecordDataRepo examRecordDataRepo;
+    
+    @Autowired
+    private ExamRecordDataSyncService examRecordDataSyncService;
 
     @GetMapping("/findExamRecordDataEntity")
-    public ExamRecordDataDomain findExamRecordDataEntity(@RequestParam Long examRecordDataId) {
+    public ExamRecordDataDomain findExamRecordDataEntity(@RequestParam Long examRecordDataId,@RequestParam(required = false) String fromCache) {
+        if(fromCache!=null) {
+            examRecordDataId = examRecordDataSyncService.getExamRecordDataIdByCacheId(examRecordDataId);
+            if(examRecordDataId==null) {
+                throw new StatusException("1001", "未找到数据");
+            }
+        }
         ExamRecordDataEntity examRecordDataEntity = GlobalHelper.getEntity(examRecordDataRepo, examRecordDataId, ExamRecordDataEntity.class);
         ExamRecordDataDomain domain = ExamRecordDataBeanConvert.copyFrom(examRecordDataEntity);
         domain.setExamRecord(examRecordDataEntity);

+ 12 - 1
examcloud-core-oe-admin-api-provider/src/main/java/cn/com/qmth/examcloud/core/oe/admin/api/controller/ExamRecordPaperStructController.java

@@ -6,8 +6,10 @@ 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.commons.exception.StatusException;
 import cn.com.qmth.examcloud.core.oe.admin.base.utils.Check;
 import cn.com.qmth.examcloud.core.oe.admin.dao.entity.ExamRecordPaperStructEntity;
+import cn.com.qmth.examcloud.core.oe.admin.service.ExamRecordDataSyncService;
 import cn.com.qmth.examcloud.core.oe.admin.service.ExamRecordPaperStructService;
 import cn.com.qmth.examcloud.web.support.ControllerSupport;
 import io.swagger.annotations.Api;
@@ -28,10 +30,19 @@ public class ExamRecordPaperStructController extends ControllerSupport{
 	@Autowired
 	private ExamRecordPaperStructService examRecordPaperStructService;
 	
+    @Autowired
+    private ExamRecordDataSyncService examRecordDataSyncService;
+	
 	@ApiOperation(value = "获取考试记录试卷结构")
 	@GetMapping("/getExamRecordPaperStruct")
-	public ExamRecordPaperStructEntity getExamRecordPaperStruct(@RequestParam Long examRecordDataId){
+	public ExamRecordPaperStructEntity getExamRecordPaperStruct(@RequestParam Long examRecordDataId,@RequestParam(required = false) String fromCache){
 		Check.isNull(examRecordDataId, "examRecordDataId不能为空");
+		if(fromCache!=null) {
+            examRecordDataId = examRecordDataSyncService.getExamRecordDataIdByCacheId(examRecordDataId);
+            if(examRecordDataId==null) {
+                throw new StatusException("1001", "未找到数据");
+            }
+        }
 		return examRecordPaperStructService.getExamRecordPaperStruct(examRecordDataId);
 	}
 	

+ 12 - 1
examcloud-core-oe-admin-api-provider/src/main/java/cn/com/qmth/examcloud/core/oe/admin/api/controller/ExamRecordQuestionsController.java

@@ -6,9 +6,11 @@ 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.commons.exception.StatusException;
 import cn.com.qmth.examcloud.core.oe.admin.base.utils.Check;
 import cn.com.qmth.examcloud.core.oe.admin.dao.ExamRecordQuestionsRepo;
 import cn.com.qmth.examcloud.core.oe.admin.dao.entity.ExamRecordQuestionsEntity;
+import cn.com.qmth.examcloud.core.oe.admin.service.ExamRecordDataSyncService;
 import cn.com.qmth.examcloud.web.support.ControllerSupport;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -29,10 +31,19 @@ public class ExamRecordQuestionsController extends ControllerSupport{
 	@Autowired
 	private ExamRecordQuestionsRepo examRecordQuestionsRepo;
 	
+    @Autowired
+    private ExamRecordDataSyncService examRecordDataSyncService;
+	
 	@ApiOperation(value = "获取交卷之后的所有试题作答信息")
 	@GetMapping("/getExamRecordQuestions")
-	public ExamRecordQuestionsEntity getExamRecordQuestions(@RequestParam Long examRecordDataId){
+	public ExamRecordQuestionsEntity getExamRecordQuestions(@RequestParam Long examRecordDataId,@RequestParam(required = false) String fromCache){
 		Check.isNull(examRecordDataId, "examRecordDataId不能为空");
+		if(fromCache!=null) {
+            examRecordDataId = examRecordDataSyncService.getExamRecordDataIdByCacheId(examRecordDataId);
+            if(examRecordDataId==null) {
+                throw new StatusException("1001", "未找到数据");
+            }
+        }
 		return examRecordQuestionsRepo.findByExamRecordDataId(examRecordDataId);
 	}
 	

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

@@ -1,82 +1,83 @@
 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.commons.exception.StatusException;
 import cn.com.qmth.examcloud.core.oe.admin.base.utils.Check;
+import cn.com.qmth.examcloud.core.oe.admin.service.ExamRecordDataSyncService;
 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;
-
+    
+    @Autowired
+    private ExamRecordDataSyncService examRecordDataSyncService;
     /**
      * 练习课程列表
-     *
      * @param examId
+     * @param studentId
      * @return
      */
     @ApiOperation(value = "练习课程列表")
     @GetMapping("/queryPracticeCourseList")
-    public List<PracticeCourseInfo> queryPracticeCourseList(@RequestParam Long examId) {
+    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) {
+    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) {
+    public PracticeDetailInfo getPracticeDetailInfo(@RequestParam Long examRecordDataId,@RequestParam(required = false) String fromCache){
         Check.isNull(examRecordDataId, "examRecordDataId不能为空");
-
-        if (StringUtils.isBlank(dbType)) {
-            return practiceService.getPracticeDetailInfo(examRecordDataId, DbType.TABLE);
+        if(fromCache!=null) {
+            examRecordDataId = examRecordDataSyncService.getExamRecordDataIdByCacheId(examRecordDataId);
+            if(examRecordDataId==null) {
+                throw new StatusException("1001", "未找到数据");
+            }
         }
-
-        return practiceService.getPracticeDetailInfo(examRecordDataId, DbType.valueOf(dbType));
+        return practiceService.getPracticeDetailInfo(examRecordDataId);
     }
-
+    
 }

+ 2 - 7
examcloud-core-oe-admin-dao/src/main/java/cn/com/qmth/examcloud/core/oe/admin/dao/ExamRecordDataSyncRepo.java

@@ -1,15 +1,10 @@
 package cn.com.qmth.examcloud.core.oe.admin.dao;
 
-import cn.com.qmth.examcloud.core.oe.admin.dao.entity.ExamRecordDataEntity;
-import cn.com.qmth.examcloud.core.oe.admin.dao.entity.ExamRecordDataSyncEntity;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
-import org.springframework.data.jpa.repository.Modifying;
-import org.springframework.data.jpa.repository.Query;
 import org.springframework.stereotype.Repository;
-import org.springframework.transaction.annotation.Transactional;
 
-import java.util.List;
+import cn.com.qmth.examcloud.core.oe.admin.dao.entity.ExamRecordDataSyncEntity;
 
 /**
  * @Description 同步
@@ -19,5 +14,5 @@ import java.util.List;
  */
 @Repository
 public interface ExamRecordDataSyncRepo extends JpaRepository<ExamRecordDataSyncEntity, Long>, JpaSpecificationExecutor<ExamRecordDataSyncEntity> {
-
+    public ExamRecordDataSyncEntity findByCacheId(Long cacheId);
 }

+ 8 - 0
examcloud-core-oe-admin-service/src/main/java/cn/com/qmth/examcloud/core/oe/admin/service/ExamRecordDataSyncService.java

@@ -0,0 +1,8 @@
+package cn.com.qmth.examcloud.core.oe.admin.service;
+
+public interface ExamRecordDataSyncService {
+
+
+    public Long getExamRecordDataIdByCacheId(Long cacheId);
+
+}

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

@@ -5,7 +5,6 @@ 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;
 
 /**
  * 
@@ -35,6 +34,6 @@ public interface PracticeService {
 	 * 单次练习答题情况统计
 	 * @return
 	 */
-	PracticeDetailInfo getPracticeDetailInfo(Long examRecordDataId, DbType dbType);
+	PracticeDetailInfo getPracticeDetailInfo(Long examRecordDataId);
 
 }

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

@@ -0,0 +1,26 @@
+package cn.com.qmth.examcloud.core.oe.admin.service.impl;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import cn.com.qmth.examcloud.core.oe.admin.dao.ExamRecordDataSyncRepo;
+import cn.com.qmth.examcloud.core.oe.admin.dao.entity.ExamRecordDataSyncEntity;
+import cn.com.qmth.examcloud.core.oe.admin.service.ExamRecordDataSyncService;
+
+@Service("examRecordDataSyncServiceImpl")
+public class ExamRecordDataSyncServiceImpl implements ExamRecordDataSyncService {
+
+    @Autowired
+    private ExamRecordDataSyncRepo examRecordDataSyncRepo;
+
+
+    @Override
+    public Long getExamRecordDataIdByCacheId(Long cacheId) {
+        ExamRecordDataSyncEntity e=examRecordDataSyncRepo.findByCacheId(cacheId);
+        if(e!=null) {
+            return e.getDbId();
+        }
+        return null;
+    }
+
+}

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

@@ -1,13 +1,25 @@
 package cn.com.qmth.examcloud.core.oe.admin.service.impl;
 
-import cn.com.qmth.examcloud.commons.exception.StatusException;
+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.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.*;
+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.enums.ExamRecordStatus;
 import cn.com.qmth.examcloud.core.oe.admin.service.ExamRecordPaperStructService;
 import cn.com.qmth.examcloud.core.oe.admin.service.PracticeService;
@@ -19,20 +31,7 @@ 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;
 
 
 /**
@@ -59,9 +58,6 @@ 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) {
@@ -72,127 +68,13 @@ 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();
@@ -250,6 +132,23 @@ 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();
 
@@ -264,7 +163,7 @@ public class PracticeServiceImpl implements PracticeService {
         practiceRecordInfo.setObjectiveAccuracy(examScoreEntity.getObjectiveAccuracy());//客观题答对的比率
         ExamRecordQuestionsEntity examRecordQuestions = examRecordQuestionsRepo.findByExamRecordDataId(examRecordData.getId());
         List<ExamQuestionEntity> examQuestionEntities = examRecordQuestions.getExamQuestionEntities();
-        practiceRecordInfo = calculationExamQuestionSituationInfo(practiceRecordInfo, copyFromEntityList(examQuestionEntities));
+        practiceRecordInfo = calculationExamQuestionSituationInfo(practiceRecordInfo, examQuestionEntities);
 
         return practiceRecordInfo;
     }
@@ -273,18 +172,17 @@ public class PracticeServiceImpl implements PracticeService {
      * 计算答题情况
      *
      * @param practiceRecordInfo
-     * @param examQuestionList
+     * @param examQuestionEntities
      * @return
      */
-    private PracticeRecordInfo calculationExamQuestionSituationInfo(PracticeRecordInfo practiceRecordInfo,
-                                                                    List<ExamQuestion> examQuestionList) {
+    private PracticeRecordInfo calculationExamQuestionSituationInfo(PracticeRecordInfo practiceRecordInfo, List<ExamQuestionEntity> examQuestionEntities) {
         if (practiceRecordInfo == null) {
             practiceRecordInfo = new PracticeRecordInfo();
         }
         int succQuestionNum = 0;//正确答题数
         int failQuestionNum = 0;//错误答题数
         int notAnsweredCount = 0;//未作答题数
-        for (ExamQuestion examQuestionEntity : examQuestionList) {
+        for (ExamQuestionEntity examQuestionEntity : examQuestionEntities) {
             if (examQuestionEntity.getIsAnswer() == null || !examQuestionEntity.getIsAnswer()) {
                 notAnsweredCount++;
             } else {
@@ -301,7 +199,7 @@ public class PracticeServiceImpl implements PracticeService {
             }
         }
         int objectiveQuestionsNum = 0;//客观题总数
-        for (ExamQuestion examQuestionEntity : examQuestionList) {
+        for (ExamQuestionEntity examQuestionEntity : examQuestionEntities) {
             if (QuestionTypeUtil.isObjectiveQuestion(examQuestionEntity.getQuestionType())) {
                 objectiveQuestionsNum++;
             }
@@ -310,112 +208,59 @@ public class PracticeServiceImpl implements PracticeService {
         practiceRecordInfo.setSuccQuestionNum(succQuestionNum);
         practiceRecordInfo.setFailQuestionNum(failQuestionNum);
         practiceRecordInfo.setNotAnsweredCount(notAnsweredCount);
-        practiceRecordInfo.setTotalQuestionCount(examQuestionList.size());
+        practiceRecordInfo.setTotalQuestionCount(examQuestionEntities.size());
         return practiceRecordInfo;
     }
 
-    /**
-     * 根据数据类型获取试卷
-     *
-     * @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();
-            }
-        }
-
-        //如果数据类型为table或者缓存中未取到,则从数据库中获取
-        if (DbType.TABLE == dbType || null == examRecordPaperStruct) {
-            return examRecordPaperStructService.getExamRecordPaperStruct(examRecordDataId).getDefaultPaper();
+    @Override
+    public PracticeDetailInfo getPracticeDetailInfo(Long examRecordDataId) {
+        if (examRecordDataId == null) {
+            return null;
         }
+        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);
 
-        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);
+            objectiveNum += practiceRecordInfo.getObjectiveNum();
+            objectSuccessNum += practiceRecordInfo.getSuccQuestionNum();
 
-                        if (questionCount > 0 && questionCount == examQuestionList.size()) {
-                            return examQuestionList;
-                        }
-                    }
-                }
-            }
+            paperStructInfo.setQuestionCount(practiceRecordInfo.getTotalQuestionCount());
+            paperStructInfo.setSuccQuestionNum(practiceRecordInfo.getSuccQuestionNum());
+            paperStructInfo.setFailQuestionNum(practiceRecordInfo.getFailQuestionNum());
+            paperStructInfo.setNotAnsweredCount(practiceRecordInfo.getNotAnsweredCount());
+            paperStructInfos.add(paperStructInfo);
         }
+        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);
 
-        //从缓存中未取到,或者指定了从数据库中取,则从数据库中获取
-        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);
+        double objectiveAccuracy = 0;//客观题答题正确率
+        if (objectiveNum > 0) {
+            objectiveAccuracy = Double.valueOf(new DecimalFormat("#.00").format(objectSuccessNum * 100D / objectiveNum));
         }
-
-        throw new StatusException("100001", "暂不支持的数据类型");
+        practiceDetailInfo.setObjectiveAccuracy(objectiveAccuracy);
+        return practiceDetailInfo;
     }
 
-    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;
-    }
 }