From f0f00e9ba8a755e4317e029d73b69a92ad9f9df1 Mon Sep 17 00:00:00 2001
From: kongzy <kongzy>
Date: 星期六, 14 九月 2024 17:02:41 +0800
Subject: [PATCH] update

---
 exam-system/src/main/java/com/gkhy/exam/system/service/impl/ExPaperStudentServiceImpl.java |  201 ++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 168 insertions(+), 33 deletions(-)

diff --git a/exam-system/src/main/java/com/gkhy/exam/system/service/impl/ExPaperStudentServiceImpl.java b/exam-system/src/main/java/com/gkhy/exam/system/service/impl/ExPaperStudentServiceImpl.java
index cd57bf4..63de6e3 100644
--- a/exam-system/src/main/java/com/gkhy/exam/system/service/impl/ExPaperStudentServiceImpl.java
+++ b/exam-system/src/main/java/com/gkhy/exam/system/service/impl/ExPaperStudentServiceImpl.java
@@ -4,18 +4,22 @@
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.gkhy.exam.common.api.CommonPage;
+import com.gkhy.exam.common.constant.Constant;
 import com.gkhy.exam.common.domain.entity.SysUser;
+import com.gkhy.exam.common.enums.PaperStudentStateEnum;
 import com.gkhy.exam.common.enums.QuestionTypeEnum;
+import com.gkhy.exam.common.enums.StudentAnswerPassEnum;
 import com.gkhy.exam.common.enums.UserTypeEnum;
 import com.gkhy.exam.common.exception.ApiException;
 import com.gkhy.exam.common.utils.PageUtils;
 import com.gkhy.exam.common.utils.SecurityUtils;
-import com.gkhy.exam.system.domain.ExExamPaper;
-import com.gkhy.exam.system.domain.ExPaperStudent;
-import com.gkhy.exam.system.domain.ExPhaseStudent;
-import com.gkhy.exam.system.domain.ExStudent;
+import com.gkhy.exam.common.utils.StringUtils;
+import com.gkhy.exam.system.domain.*;
+import com.gkhy.exam.system.domain.vo.BatchPaperStudentVO;
+import com.gkhy.exam.system.domain.vo.ExPaperStudentVO;
 import com.gkhy.exam.system.mapper.*;
 import com.gkhy.exam.system.service.ExPaperStudentService;
+import com.gkhy.exam.system.service.ExStudentAnswerService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -36,11 +40,15 @@
     @Autowired
     private ExExamPaperMapper examPaperMapper;
     @Autowired
+    private ExStudentAnswerService studentAnswerService;
+    @Autowired
     private ExStudentAnswerMapper studentAnswerMapper;
     @Autowired
     private ExStudentMapper studentMapper;
     @Autowired
     private ExPhaseStudentMapper phaseStudentMapper;
+    @Autowired
+    private ExQuestionMapper questionMapper;
 
 
     @Override
@@ -78,26 +86,38 @@
     }
 
     @Override
-    public int batchAddPaperStudent(Map<String,Object> paperStudentMap) {
-        List<Long> phaseIds= (List<Long>) paperStudentMap.get("phaseIds");
-        List<Long> studentIds= (List<Long>) paperStudentMap.get("studentIds");
+    public int batchAddPaperStudent(BatchPaperStudentVO batchPaperStudentVO) {
+        List<Long> phaseIds= batchPaperStudentVO.getPhaseIds();
+        List<Long> studentIds= batchPaperStudentVO.getStudentIds();
+        Long paperId=batchPaperStudentVO.getPaperId();
         if(ObjectUtil.isEmpty(phaseIds) && ObjectUtil.isEmpty(studentIds)){
             throw new ApiException("批次id与学员id不能同时为空");
         }
-        Long paperId= (Long) paperStudentMap.get("paperId");
-        if(paperId==null){
-            throw new ApiException("考卷id不能为空");
-        }
+        List<Long> allStudentIds=new ArrayList<>();
         //按批次绑定用户
-        if(phaseIds.size()>0){
+        if(phaseIds!=null&&!phaseIds.isEmpty()){
             List<ExPhaseStudent> phaseStudentList=phaseStudentMapper.selectList( Wrappers.<ExPhaseStudent>lambdaQuery()
                     .in(ExPhaseStudent::getPhaseId, phaseIds));
-            studentIds=phaseStudentList.stream().map(item -> item.getStudentId()).distinct().collect(Collectors.toList());
+            allStudentIds=phaseStudentList.stream().map(item -> item.getStudentId()).distinct().collect(Collectors.toList());
         }
-        List<ExPaperStudent> paperStudents=studentIds.stream().map(item -> {
-            return new ExPaperStudent().setPaperId(paperId).setStudentId(item);
+        if(studentIds!=null&&!studentIds.isEmpty()){
+            allStudentIds.addAll(studentIds);
+        }
+        List<ExPaperStudent> paperStudentList=baseMapper.selectList( Wrappers.<ExPaperStudent>lambdaQuery()
+                .eq(true,ExPaperStudent::getPaperId, paperId)
+                .in(true,ExPaperStudent::getStudentId,allStudentIds));
+        if(paperStudentList.size()>0) {
+            List<Long> existStudentIds = paperStudentList.stream().map(item -> item.getStudentId()).distinct().collect(Collectors.toList());
+            allStudentIds.removeAll(existStudentIds);
+        }
+        if(allStudentIds.isEmpty()){
+            throw new ApiException("未匹配到学员");
+        }
+        allStudentIds= allStudentIds.stream().distinct().collect(Collectors.toList());
+        List<ExPaperStudent> paperStudents=allStudentIds.stream().map(item -> {
+            return new ExPaperStudent().setPaperId(paperId).setStudentId(item).setCreateId(SecurityUtils.getUserId());
         }).collect(Collectors.toList());
-        checkStudentUnique(paperStudents);
+      //  checkStudentUnique(paperStudents);
         int row=baseMapper.batchInsert(paperStudents);
         if(row<1){
             throw new ApiException("批量分配学员失败");
@@ -115,6 +135,57 @@
             }
         }
     }
+
+    @Override
+    @Transactional(rollbackFor = RuntimeException.class)
+    public void doReview(ExPaperStudentVO paperStudentVO) {
+        checkUserAllowed(new ExPaperStudent().setPaperId(paperStudentVO.getPaperId()));
+        ExPaperStudent paperStudent=baseMapper.selectById(paperStudentVO.getId());
+        ExExamPaper examPaper=examPaperMapper.selectById(paperStudent.getPaperId());
+        if(paperStudent.getState().equals(PaperStudentStateEnum.WAIT_EXAM.getCode())){
+            throw new ApiException("待考试状态的试卷不能批改!");
+        }
+        List<ExStudentAnswer> studentAnswerList=studentAnswerMapper.selectList(Wrappers.<ExStudentAnswer>lambdaQuery()
+                .eq(true,ExStudentAnswer::getStudentId,paperStudent.getStudentId())
+                .eq(true,ExStudentAnswer::getPaperId,paperStudent.getPaperId()));
+        Map<Long, ExStudentAnswer> collectMap = studentAnswerList.stream().collect(Collectors.toMap(ExStudentAnswer::getQuestionId, k -> k));
+        List<ExPaperStudentVO.QuestionVO> questionVOList=paperStudentVO.getQuestions();
+        List<ExStudentAnswer> updateStudentAnswerList=new ArrayList<>();
+        for (ExPaperStudentVO.QuestionVO questionVO:questionVOList){
+            ExStudentAnswer sa=collectMap.get(questionVO.getQuestionId());
+            if(sa!=null){
+                int score=questionVO.getScore();
+                sa.setScore(score);
+                if(score>examPaper.getEasyScore()){
+                    throw new ApiException("得分不能超过题目的最高分!");
+                }else if(score==examPaper.getEasyScore()){
+                    sa.setPassed(StudentAnswerPassEnum.CORRECT.getCode());
+                }else{
+                    sa.setPassed(StudentAnswerPassEnum.ERROR.getCode());
+                }
+                updateStudentAnswerList.add(sa);
+            }
+        }
+        int totalScore=0;
+        for(ExStudentAnswer studentAnswer:studentAnswerList){
+            if(studentAnswer.getScore()!=null) {
+                totalScore = totalScore + studentAnswer.getScore();
+            }
+        }
+        paperStudent.setState(PaperStudentStateEnum.DONE_REVIEW.getCode());
+        paperStudent.setScore(totalScore);
+        if(totalScore<examPaper.getPassScore()){
+            paperStudent.setPassed(Constant.EXAM_UNPASS);
+        }else{
+            paperStudent.setPassed(Constant.EXAM_PASS);
+        }
+        paperStudent.setUpdateBy(SecurityUtils.getUsername());
+        baseMapper.updateById(paperStudent);
+        if(!updateStudentAnswerList.isEmpty()){
+            studentAnswerService.updateBatchById(updateStudentAnswerList);
+        }
+    }
+
 
     @Override
     public CommonPage selectPaperStudentList(ExPaperStudent paperStudent) {
@@ -166,32 +237,96 @@
     }
 
     @Override
-    public void endExam(ExPaperStudent paperStudent) {
+    public void endExam(ExPaperStudent pStudent) {
+        if(pStudent.getId()==null){
+            throw new ApiException("学员与试卷关系id不能为空");
+        }
+        ExPaperStudent existPs=baseMapper.selectById(pStudent.getId());
+        if(existPs==null){
+            throw new ApiException("学员与试卷关系不存在");
+        }
         Long endTime=System.currentTimeMillis();
-        //异步计算
+        existPs.setEndTime(endTime);
+        handlePaperData(existPs);
+
+    }
+
+    @Override
+    @Transactional(rollbackFor = RuntimeException.class)
+    public void handlePaperData(ExPaperStudent paperStudent){
         //计算考试成绩
         ExExamPaper paper=examPaperMapper.selectById(paperStudent.getPaperId());
-        int singleCount=studentAnswerMapper.selectPassCount(paperStudent.getPaperId(),paperStudent.getStudentId(), QuestionTypeEnum.SINGLE.getCode());
-        int multiCount=studentAnswerMapper.selectPassCount(paperStudent.getPaperId(),paperStudent.getStudentId(), QuestionTypeEnum.MULTI.getCode());
-        int judgeCount=studentAnswerMapper.selectPassCount(paperStudent.getPaperId(),paperStudent.getStudentId(), QuestionTypeEnum.JUDGE.getCode());
-        int score=singleCount*paper.getSingleScore()+multiCount*paper.getMultiScore()+judgeCount*paper.getJudgeScore();
-        ExPaperStudent exPaperStudent = new ExPaperStudent()
-                .setPaperId(paperStudent.getPaperId())
-                .setStudentId(paperStudent.getStudentId())
-                .setCompleted(1)
-                .setEndTime(endTime)
-                .setScore(score);
-        if(score>=paper.getPassScore()){
-            exPaperStudent.setPassed(1);
-        }else{
-            exPaperStudent.setPassed(0);
+        paperStudent.setState(PaperStudentStateEnum.WAIT_REVIEW.getCode());
+        List<ExStudentAnswer> studentAnswerList=studentAnswerMapper.selectList(Wrappers.<ExStudentAnswer>lambdaQuery()
+                .eq(true,ExStudentAnswer::getStudentId,paperStudent.getStudentId())
+                .eq(true,ExStudentAnswer::getPaperId,paperStudent.getPaperId()));
+        List<ExQuestion> questionList=questionMapper.selectQuestionByPaperId(paperStudent.getPaperId());
+        Map<Long, ExStudentAnswer> collectMap = studentAnswerList.stream().collect(Collectors.toMap(ExStudentAnswer::getQuestionId, k -> k));
+        List<ExStudentAnswer> updateStudentAnswers=new ArrayList<>();
+        int totalScore=0;
+        boolean easyViewFlag=false;
+        for(ExQuestion question:questionList){
+            ExStudentAnswer sa=collectMap.get(question.getId());
+            if(sa!=null){
+                if(question.getQuestionType().equals(QuestionTypeEnum.EASY.getCode())) {
+                    if(StringUtils.isBlank(sa.getAnswer())){
+                        sa.setPassed(StudentAnswerPassEnum.ERROR.getCode());
+                        sa.setScore(0);
+                    }else{
+                        sa.setPassed(StudentAnswerPassEnum.WAIT_REVIEW.getCode());
+                        easyViewFlag=true;
+                    }
+                }else{
+                    if (sa.getAnswer().equals(question.getAnswer())) {
+                        sa.setPassed(StudentAnswerPassEnum.CORRECT.getCode());
+                        sa.setScore(getScore(paper, question.getQuestionType()));
+                        totalScore = totalScore + sa.getScore();
+                    }else {
+                        sa.setPassed(StudentAnswerPassEnum.ERROR.getCode());
+                        sa.setScore(0);
+                    }
+                }
+            }else{
+                sa=new ExStudentAnswer();
+                sa.setPassed(StudentAnswerPassEnum.ERROR.getCode());
+                sa.setScore(0);
+                sa.setStudentId(paperStudent.getStudentId());
+                sa.setPaperId(paperStudent.getPaperId());
+                sa.setQuestionId(question.getId());
+            }
+            updateStudentAnswers.add(sa);
         }
-        int row=baseMapper.updateById(exPaperStudent);
+
+        studentAnswerService.saveOrUpdateBatch(updateStudentAnswers);
+        paperStudent.setScore(totalScore);
+        if(!easyViewFlag){
+            //没有简答题,直接批改试卷
+            paperStudent.setState(PaperStudentStateEnum.DONE_REVIEW.getCode());
+            if(paper.getPassScore()>totalScore){
+                paperStudent.setPassed(Constant.EXAM_UNPASS);
+            }else{
+                paperStudent.setPassed(Constant.EXAM_PASS);
+            }
+        }
+        int row=baseMapper.updateById(paperStudent);
         if(row<1){
             throw new ApiException("提交考试失败");
         }
     }
 
+    private Integer getScore(ExExamPaper examPaper,Integer questionType){
+        if(questionType.equals(QuestionTypeEnum.SINGLE.getCode())){
+            return examPaper.getSingleScore();
+        }else if(questionType.equals(QuestionTypeEnum.MULTI.getCode())){
+            return examPaper.getMultiScore();
+        }else if(questionType.equals(QuestionTypeEnum.JUDGE.getCode())){
+            return examPaper.getJudgeScore();
+        }else if(questionType.equals(QuestionTypeEnum.EASY.getCode())){
+            return examPaper.getEasyScore();
+        }
+        return 0;
+    }
+
 
 
 }

--
Gitblit v1.9.2