Przeglądaj źródła

重构考生获取最终分数计算方式

lideyin 5 lat temu
rodzic
commit
a8a503f9ed

+ 8 - 1
examcloud-core-oe-student-api-provider/src/main/java/cn/com/qmth/examcloud/core/oe/student/provider/OeExamRecordForMarkingCloudServiceProvider.java

@@ -3,10 +3,12 @@ package cn.com.qmth.examcloud.core.oe.student.provider;
 import cn.com.qmth.examcloud.commons.exception.StatusException;
 import cn.com.qmth.examcloud.core.oe.common.entity.ExamRecordForMarkingEntity;
 import cn.com.qmth.examcloud.core.oe.common.repository.ExamRecordForMarkingRepo;
+import cn.com.qmth.examcloud.core.oe.common.repository.ExamStudentFinalScoreRepo;
 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.core.oe.student.api.request.UpdateExamRecordForMarkingBatchNumReq;
 import cn.com.qmth.examcloud.core.oe.student.service.ExamRecordQuestionsService;
+import cn.com.qmth.examcloud.core.oe.student.service.ExamStudentFinalScoreService;
 import cn.com.qmth.examcloud.web.support.ControllerSupport;
 import com.mysql.cj.util.StringUtils;
 import io.swagger.annotations.Api;
@@ -15,7 +17,6 @@ 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.RestController;
-import java.util.List;
 
 @Api(tags = "保存阅卷数据接口")
 @RestController
@@ -34,6 +35,9 @@ public class OeExamRecordForMarkingCloudServiceProvider extends ControllerSuppor
     @Autowired
     private ExamRecordForMarkingRepo examRecordForMarkingRepo;
 
+    @Autowired
+    private ExamStudentFinalScoreService examStudentFinalScoreService;
+
     @Override
     @PostMapping("/saveExamRecordForMarking")
     public void saveExamRecordForMarking(@RequestBody SaveExamRecordForMarkingReq req) {
@@ -52,6 +56,9 @@ public class OeExamRecordForMarkingCloudServiceProvider extends ControllerSuppor
         int subjectiveAnswerLength = examRecordQuestionsService.calculationSubjectiveAnswerLength(req.getExamRecordDataId());
         examRecordForMarking.setSubjectiveAnswerLength(subjectiveAnswerLength);
         examRecordForMarkingRepo.save(examRecordForMarking);
+
+        //计算考生的最终分数
+        examStudentFinalScoreService.calculateFinalScore(req.getExamStudentId());
     }
 
 

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

@@ -1,4 +1,7 @@
 package cn.com.qmth.examcloud.core.oe.student.service;
+
+import cn.com.qmth.examcloud.core.oe.common.entity.ExamStudentFinalScoreEntity;
+
 /**
  * @Description 考生最终成绩接口
  * @Author lideyin

+ 132 - 0
examcloud-core-oe-student-service/src/main/java/cn/com/qmth/examcloud/core/oe/student/service/impl/ExamStudentFinalScoreServiceImpl.java

@@ -0,0 +1,132 @@
+package cn.com.qmth.examcloud.core.oe.student.service.impl;
+
+import cn.com.qmth.examcloud.core.oe.common.entity.ExamRecordDataEntity;
+import cn.com.qmth.examcloud.core.oe.common.entity.ExamScoreEntity;
+import cn.com.qmth.examcloud.core.oe.common.entity.ExamStudentEntity;
+import cn.com.qmth.examcloud.core.oe.common.entity.ExamStudentFinalScoreEntity;
+import cn.com.qmth.examcloud.core.oe.common.enums.ExamProperties;
+import cn.com.qmth.examcloud.core.oe.common.enums.ExamRecordStatus;
+import cn.com.qmth.examcloud.core.oe.common.enums.MarkingType;
+import cn.com.qmth.examcloud.core.oe.common.helper.ExamCacheTransferHelper;
+import cn.com.qmth.examcloud.core.oe.common.repository.ExamRecordDataRepo;
+import cn.com.qmth.examcloud.core.oe.common.repository.ExamScoreRepo;
+import cn.com.qmth.examcloud.core.oe.common.repository.ExamStudentFinalScoreRepo;
+import cn.com.qmth.examcloud.core.oe.common.repository.ExamStudentRepo;
+import cn.com.qmth.examcloud.core.oe.student.service.ExamStudentFinalScoreService;
+import cn.com.qmth.examcloud.web.helpers.GlobalHelper;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ * @Description 考生最终分数实现类
+ * @Author lideyin
+ * @Date 2019/11/11 14:30
+ * @Version 1.0
+ */
+public class ExamStudentFinalScoreServiceImpl implements ExamStudentFinalScoreService {
+    @Autowired
+    private ExamRecordDataRepo examRecordDataRepo;
+    @Autowired
+    private ExamScoreRepo examScoreRepo;
+    @Autowired
+    private ExamStudentRepo examStudentRepo;
+    @Autowired
+    private ExamStudentFinalScoreRepo examStudentFinalScoreRepo;
+
+    @Override
+    public void calculateFinalScore(Long examStudentId) {
+        ExamStudentEntity examStudent = GlobalHelper.getEntity(examStudentRepo, examStudentId, ExamStudentEntity.class);
+        String markingType = ExamCacheTransferHelper.
+                getDefaultCachedExamProperty(examStudent.getExamId(), ExamProperties.MARKING_TYPE.name()).getValue();
+        String examType = ExamCacheTransferHelper.getDefaultCachedExam(examStudent.getExamId()).getExamType();
+        List<ExamRecordDataEntity> allExamRecordDataList = examRecordDataRepo.findByExamStudentId(examStudentId);
+
+        //得到最终考试结果
+        ExamScoreEntity finalEffectiveExamScore = getFinalEffectiveExamScore(allExamRecordDataList, examType, markingType);
+
+        //保存最终考试结果
+        ExamStudentFinalScoreEntity finalScoreEntity = copyExamStudentFinalScoreEntityFrom(finalEffectiveExamScore);
+        examStudentFinalScoreRepo.save(finalScoreEntity);
+    }
+
+    private ExamStudentFinalScoreEntity copyExamStudentFinalScoreEntityFrom(ExamScoreEntity finalEffectiveExamScore) {
+        ExamStudentFinalScoreEntity finalScoreEntity = new ExamStudentFinalScoreEntity();
+
+        finalScoreEntity.setExamRecordDataId(finalEffectiveExamScore.getExamRecordDataId());
+        finalScoreEntity.setExamStudentId(finalEffectiveExamScore.getExamRecordDataId());
+        finalScoreEntity.setObjectiveAccuracy(finalEffectiveExamScore.getObjectiveAccuracy());
+        finalScoreEntity.setObjectiveScore(finalEffectiveExamScore.getObjectiveScore());
+        finalScoreEntity.setSubjectiveScore(finalEffectiveExamScore.getSubjectiveScore());
+        finalScoreEntity.setSuccPercent(finalEffectiveExamScore.getSuccPercent());
+        finalScoreEntity.setTotalScore(finalEffectiveExamScore.getTotalScore());
+
+        return finalScoreEntity;
+    }
+
+
+    /**
+     * 计算得出最终有效成绩
+     */
+    private ExamScoreEntity getFinalEffectiveExamScore(List<ExamRecordDataEntity> examRecordAllList, String examType, String markingType) {
+        /*
+         * 第一次过滤考试记录:
+         * 状态为EXAM_END或EXAM_OVERDUE
+         */
+        List<ExamRecordDataEntity> firstFilterExamRecordList = examRecordAllList.stream().filter(examRecord -> {
+            return examRecord.getExamRecordStatus() == ExamRecordStatus.EXAM_END ||
+                    examRecord.getExamRecordStatus() == ExamRecordStatus.EXAM_OVERDUE;
+        }).collect(Collectors.toList());
+
+        if (firstFilterExamRecordList == null || firstFilterExamRecordList.size() == 0) {
+            return null;
+        }
+
+        /*
+         * 第二次过滤考试记录:
+         * 没有违纪的&&(没有警告或有警告已审核通过的)
+         */
+        Stream<ExamRecordDataEntity> secondFilterExamRecordStream = firstFilterExamRecordList.stream().filter(examRecord -> {
+            return !examRecord.getIsIllegality() && (!examRecord.getIsWarn() || (examRecord.getIsWarn() && examRecord.getIsAudit()));
+        });
+
+        List<ExamRecordDataEntity> secondFilterExamRecords = secondFilterExamRecordStream.collect(Collectors.toList());
+        if (secondFilterExamRecords == null || secondFilterExamRecords.size() == 0) {
+            return null;
+        }
+
+        //取出有效记录的成绩
+        List<Long> examRecordDataIds = new ArrayList<>();
+        for (int i = 0; i < secondFilterExamRecords.size(); i++) {
+            examRecordDataIds.add(secondFilterExamRecords.get(i).getId());
+        }
+        List<ExamScoreEntity> effectiveExamScoreList = examScoreRepo.findByExamRecordDataIdIn(examRecordDataIds);
+        if (effectiveExamScoreList == null || effectiveExamScoreList.size() == 0) {
+            return null;
+        }
+        //离线考试
+        if ("OFFLINE".equals(examType)) {
+            return effectiveExamScoreList.get(0);
+        } else {
+            if (markingType.equals(MarkingType.ALL.name()) || markingType.equals(MarkingType.OBJECT_SCORE_MAX.name())) {
+                //全部评阅规则或客观分最高规则:取总分最高
+                List<ExamScoreEntity> examScores = effectiveExamScoreList
+                        .stream()
+                        .sorted((o1, o2) -> o2.getTotalScore().compareTo(o1.getTotalScore()))
+                        .collect(Collectors.toList());
+                return examScores.get(0);
+            } else if (markingType.equals(MarkingType.LAST_SUBMIT.name())) {
+                //最后一次提交规则:取最后一次的成绩
+                List<ExamScoreEntity> examScores = effectiveExamScoreList
+                        .stream()
+                        .sorted((o1, o2) -> o2.getId().compareTo(o1.getId()))
+                        .collect(Collectors.toList());
+                return examScores.get(0);
+            }
+        }
+        return null;
+    }
+}

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

@@ -144,7 +144,7 @@ public class FaceBiopsyServiceImpl implements FaceBiopsyService {
 
         //同步更新考试记录表中的活体检测结果
         IsSuccess faceVerifyResult = resp.getVerifyResult() ? IsSuccess.SUCCESS : IsSuccess.FAILED;
-        examRecordDataRepo.updateFaceVerifyResult(faceVerifyResult, req.getExamRecordDataId());
+        examRecordDataRepo.updateFaceVerifyResult(faceVerifyResult.toString(), req.getExamRecordDataId());
 
         return resp;
     }