From c46f49af9e766aed0ba583fce0efab98ebcdf76c Mon Sep 17 00:00:00 2001
From: fuliqi <fuliqi@qq.com>
Date: 星期二, 18 六月 2024 17:12:06 +0800
Subject: [PATCH] 管理员增加学生端权限

---
 src/main/java/com/ycl/jxkg/service/impl/ExamServiceImpl.java |  230 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 225 insertions(+), 5 deletions(-)

diff --git a/src/main/java/com/ycl/jxkg/service/impl/ExamServiceImpl.java b/src/main/java/com/ycl/jxkg/service/impl/ExamServiceImpl.java
index afbca10..e2473ff 100644
--- a/src/main/java/com/ycl/jxkg/service/impl/ExamServiceImpl.java
+++ b/src/main/java/com/ycl/jxkg/service/impl/ExamServiceImpl.java
@@ -1,23 +1,32 @@
 package com.ycl.jxkg.service.impl;
 
+import com.alibaba.fastjson2.JSON;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
 import com.ycl.jxkg.context.WebContext;
-import com.ycl.jxkg.domain.entity.Exam;
+import com.ycl.jxkg.domain.entity.*;
+import com.ycl.jxkg.domain.exam.PaperFixQuestionDTO;
+import com.ycl.jxkg.domain.vo.*;
+import com.ycl.jxkg.domain.vo.admin.exam.ExamPaperEditRequestVO;
+import com.ycl.jxkg.enums.ExamPaperTypeEnum;
+import com.ycl.jxkg.enums.QuestionTypeEnum;
 import com.ycl.jxkg.enums.general.ExamStatusEnum;
-import com.ycl.jxkg.mapper.ExamMapper;
+import com.ycl.jxkg.enums.general.ExamSubmitTempStatusEnum;
+import com.ycl.jxkg.mapper.*;
+import com.ycl.jxkg.service.ExamPaperService;
 import com.ycl.jxkg.service.ExamService;
 import com.ycl.jxkg.base.Result;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ycl.jxkg.domain.form.ExamForm;
-import com.ycl.jxkg.domain.vo.ExamVO;
 import com.ycl.jxkg.domain.query.ExamQuery;
 import org.springframework.stereotype.Service;
 import lombok.RequiredArgsConstructor;
 import com.ycl.jxkg.utils.PageUtil;
 import org.springframework.beans.BeanUtils;
 import org.springframework.util.Assert;
+import org.springframework.util.StringUtils;
 
-import java.util.List;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -32,9 +41,15 @@
 
     private final ExamMapper examMapper;
     private final WebContext webContext;
+    private final QuestionMapper questionMapper;
+    private final ExamSubmitTempMapper examSubmitTempMapper;
+    private final ClassesUserMapper classesUserMapper;
+    private final ExamPaperMapper examPaperMapper;
+    private final ExamPaperService examPaperService;
 
     /**
      * 娣诲姞
+     *
      * @param form
      * @return
      */
@@ -49,6 +64,7 @@
 
     /**
      * 淇敼
+     *
      * @param form
      * @return
      */
@@ -65,6 +81,7 @@
 
     /**
      * 鎵归噺鍒犻櫎
+     *
      * @param ids
      * @return
      */
@@ -76,6 +93,7 @@
 
     /**
      * id鍒犻櫎
+     *
      * @param id
      * @return
      */
@@ -87,18 +105,100 @@
 
     /**
      * 鍒嗛〉鏌ヨ
+     *
      * @param query
      * @return
      */
     @Override
     public Result page(ExamQuery query) {
         IPage<ExamVO> page = PageUtil.getPage(query, ExamVO.class);
-        baseMapper.getPage(page, query);
+        baseMapper.getPage(page, query, webContext.getCurrentUser().getId());
+        page.getRecords().stream().forEach(item -> {
+            if (! StringUtils.hasText(item.getClassName())) {
+                item.setClassName("鐝骇涓嶅瓨鍦ㄦ垨琚垹闄�");
+                item.setClassesId(null);
+            }
+            if (! StringUtils.hasText(item.getExamPaperName())) {
+                item.setExamPaperName("璇曞嵎涓嶅瓨鍦ㄦ垨琚垹闄�");
+                item.setExamPaperId(null);
+            }
+        });
         return Result.ok().data(page.getRecords()).total(page.getTotal());
+    }
+
+
+    @Override
+    public Result studentPage(ExamQuery query) {
+        IPage<ExamVO> page = PageUtil.getPage(query, ExamVO.class);
+        baseMapper.studentPage(page, query, webContext.getCurrentUser().getId());
+        return Result.ok().data(page.getRecords()).total(page.getTotal());
+    }
+
+
+    @Override
+    public Result start(Integer id) {
+        Exam exam = baseMapper.selectById(id);
+        if (Objects.isNull(exam)) {
+            throw new RuntimeException("璇ヨ�冭瘯涓嶅瓨鍦�");
+        }
+        if (Objects.isNull(exam.getExamPaperId())) {
+            throw new RuntimeException("鑰冭瘯鏈粦瀹氳瘯鍗�");
+        }
+        // 鏌ュ嚭鑰冭瘯璇曞嵎
+        ExamPaper examPaper = examPaperMapper.selectById(exam.getExamPaperId());
+        if (Objects.isNull(examPaper)) {
+            throw new RuntimeException("璇曞嵎涓嶅瓨鍦�");
+        }
+        if (StringUtils.hasText(examPaper.getContent())) {
+            throw new RuntimeException("璇曞嵎棰樼洰涓虹┖");
+        }
+        // 灏嗛鐩浆鎹负鍙复鏃朵繚瀛樼殑棰樼洰缁撴瀯
+        if (ExamPaperTypeEnum.Fixed.getCode().equals(examPaper.getPaperType())
+                || ExamPaperTypeEnum.RandomOrder.getCode().equals(examPaper.getPaperType())) {
+            // 杞崲
+            List<PaperFixQuestionVO> data = this.coverTo(examPaper);
+            return Result.ok().data(data);
+        } else if (ExamPaperTypeEnum.Random.getCode().equals(examPaper.getPaperType())) {
+            // todo 闅忔満棰樼洰鐢熸垚
+
+        }
+        return null;
+    }
+
+    /**
+     * 灏嗘暟鎹簱瀛樺偍鐨勯鐩紝杞负鍙复鏃朵繚瀛樼殑棰樼洰缁撴瀯
+     *
+     * @param examPaper 璇曞嵎
+     * @return
+     */
+    private List<PaperFixQuestionVO> coverTo(ExamPaper examPaper) {
+        List<PaperFixQuestionDTO> questionWarpList = JSON.parseArray(examPaper.getContent(), PaperFixQuestionDTO.class);
+        return questionWarpList.stream().map(item -> {
+            PaperFixQuestionVO vo = new PaperFixQuestionVO();
+            vo.setTitle(item.getTitle());
+            vo.setQuestionType(item.getQuestionType());
+            List<DoQuestionVO> doQuestionVOS = item.getQuestionList().stream().map(question -> {
+                DoQuestionVO doQuestionVO = new DoQuestionVO();
+                doQuestionVO.setTitle(question.getTitle());
+                doQuestionVO.setQuestionType(item.getQuestionType());
+                doQuestionVO.setQuestionItemList(question.getItems());
+                doQuestionVO.setId(question.getId());
+                doQuestionVO.setOriginalFile(question.getOriginalFile());
+                doQuestionVO.setAudioFile(question.getAudioFile());
+                return doQuestionVO;
+            }).collect(Collectors.toList());
+            if (ExamPaperTypeEnum.RandomOrder.getCode().equals(examPaper.getPaperType())) {
+                // 闅忓簭璇曞嵎鎵撲贡椤哄簭
+                Collections.shuffle(doQuestionVOS);
+            }
+            vo.setQuestionList(doQuestionVOS);
+            return vo;
+        }).collect(Collectors.toList());
     }
 
     /**
      * 鏍规嵁id鏌ユ壘
+     *
      * @param id
      * @return
      */
@@ -111,6 +211,7 @@
 
     /**
      * 鍒楄〃
+     *
      * @return
      */
     @Override
@@ -121,4 +222,123 @@
                 .collect(Collectors.toList());
         return Result.ok().data(vos);
     }
+
+    @Override
+    public Result examSubmit(ExamSubmitVO submitData) {
+        // 鏍¢獙
+        Exam exam = examMapper.selectById(submitData.getExamId());
+        if (Objects.isNull(exam)) {
+            throw new RuntimeException("璇ヨ�冭瘯涓嶅瓨鍦�");
+        }
+//        // 鍒ゆ柇鍗曢�夈�佸閫夈�佸垽鏂瀵归敊
+//        List<Integer> questionIds = new ArrayList<>(24);
+//        submitData.getPaperQuestionList().forEach(item -> {
+//            List<Integer> ids = item.getQuestionList().stream().map(DoQuestionVO::getId).collect(Collectors.toList());
+//            questionIds.addAll(ids);
+//        });
+//        List<Question> questionList = questionMapper.getAnswerInfo(questionIds);
+//        Map<Integer, Question> answerMap = questionList.stream().collect(Collectors.toMap(Question::getId, entity -> entity));
+//        submitData.getQuestionList().stream().forEach(item -> {
+//            Question question = answerMap.get(item.getId());
+//            if (Objects.nonNull(question)
+//                    && (QuestionTypeEnum.SingleChoice.getCode().equals(question.getQuestionType())
+//                    || QuestionTypeEnum.MultipleChoice.getCode().equals(question.getQuestionType())
+//                    || QuestionTypeEnum.TrueFalse.getCode().equals(question.getQuestionType())
+//            )) {
+//                String correct = question.getCorrect();
+//                if (QuestionTypeEnum.MultipleChoice.getCode().equals(question.getQuestionType())) {
+//                    // 濡傛灉鏄�夋嫨棰橈紝閭d箞灏嗙瓟妗堣浆涓簂ist
+//                    List<String> answerList = JSON.parseArray(correct, String.class);
+//                    item.setRight(answerList.containsAll(item.getAnswerList()));
+//                } else {
+//                    item.setRight(question.getCorrect().equals(item.getAnswer()));
+//                }
+//            }
+//        });
+        // 闃呭嵎鍚庢墠寰�exam_paper_answer淇濆瓨鑰冭瘯鎴愮哗銆佷互鍙婁繚瀛樺埌exam_paper_customer_answer
+        // 鐜板湪鍙渶瑕佷繚瀛樺埌涓�寮犱复鏃惰〃
+        // 璇ユ帴鍙f槸涓诲姩鎻愪氦锛屾墍浠ョ姸鎬侀兘璁剧疆涓哄畬鎴愶紝浠ヤ究鍚庣画鑰佸笀闃呭嵎
+        saveTempExam(submitData, ExamSubmitTempStatusEnum.FINISH);
+        return Result.ok();
+    }
+
+    @Override
+    public Result timingSubmit(ExamSubmitVO submitData) {
+        saveTempExam(submitData, ExamSubmitTempStatusEnum.TEMP);
+        return Result.ok();
+    }
+
+    /**
+     * 淇濆瓨涓存椂璇曞嵎
+     *
+     * @param submitData  鍓嶇浼犻�掔殑璇曞嵎鏁版嵁
+     * @param status  璇曞嵎鐨勭姸鎬�
+     */
+    public void saveTempExam(ExamSubmitVO submitData, ExamSubmitTempStatusEnum status) {
+        ExamSubmitTemp one = new LambdaQueryChainWrapper<>(examSubmitTempMapper)
+                .eq(ExamSubmitTemp::getExamId, submitData.getExamId())
+                .eq(ExamSubmitTemp::getUserId, webContext.getCurrentUser().getId())
+                .one();
+        if (Objects.nonNull(one)) {
+            if (ExamSubmitTempStatusEnum.FINISH.equals(one.getStatus())) {
+                return;
+            }
+            one.setDoTime(submitData.getDoTime());
+            one.setExamSubmit(JSON.toJSONString(submitData.getPaperQuestionList()));
+            one.setCreateTime(new Date());
+            one.setStatus(status);
+            examSubmitTempMapper.updateById(one);
+        } else {
+            ExamSubmitTemp examSubmitTemp = new ExamSubmitTemp();
+            examSubmitTemp.setExamId(submitData.getExamId());
+            examSubmitTemp.setDoTime(submitData.getDoTime());
+            examSubmitTemp.setStatus(status);
+            examSubmitTemp.setUserId(webContext.getCurrentUser().getId());
+            examSubmitTemp.setExamSubmit(JSON.toJSONString(submitData.getPaperQuestionList()));
+            examSubmitTemp.setMarkPaperStatus(ExamSubmitTempStatusEnum.TEMP);
+            examSubmitTempMapper.insert(examSubmitTemp);
+        }
+    }
+
+    @Override
+    public Result getMarkPaperInfo(Integer id) {
+        Exam exam = baseMapper.selectById(id);
+        if (Objects.isNull(exam)) {
+            throw new RuntimeException("璇ヨ�冭瘯涓嶅瓨鍦�");
+        }
+        ExamPaper examPaper = examPaperMapper.selectById(exam.getExamPaperId());
+        if (Objects.isNull(examPaper)) {
+            throw new RuntimeException("鑰冭瘯璇曞嵎涓嶅瓨鍦�");
+        }
+        List<ExamSubmitTemp> examSubmitTempList = new LambdaQueryChainWrapper<>(examSubmitTempMapper)
+                .eq(ExamSubmitTemp::getExamId, id)
+                .list();
+        // 鍙傝�冧汉鏁�
+        Integer joinExamNum = examSubmitTempList.size();
+        // 鍙傝�冧絾鏈畬鎴愭彁浜や汉鏁�
+        Integer joinButNotFinishedNum = Math.toIntExact(examSubmitTempList.stream().filter(item -> ExamSubmitTempStatusEnum.TEMP.equals(item.getStatus())).count());
+
+        List<StudentExamInfoVO> studentExamList = classesUserMapper.getClassesUserList(exam.getClassesId());
+        // 搴旇�冧汉鏁�
+        Integer shouldUserNum = studentExamList.size();
+
+        studentExamList.stream().forEach(item -> {
+            if (StringUtils.hasText(item.getExamSubmit())) {
+                item.setQuestionList(JSON.parseArray(item.getExamSubmit(), DoQuestionVO.class));
+            }
+        });
+
+        MarkPaperVO markPaperVO = new MarkPaperVO();
+        markPaperVO.setExamName(exam.getExamName());
+        markPaperVO.setExamId(exam.getId());
+        markPaperVO.setJoinButNotFinishNum(joinButNotFinishedNum);
+        markPaperVO.setShouldJoinNum(shouldUserNum);
+        markPaperVO.setStudentExamInfoVOList(studentExamList);
+        markPaperVO.setMissJoinNum(shouldUserNum - joinExamNum);
+        markPaperVO.setJoinNum(joinExamNum);
+        markPaperVO.setExamPaperName(examPaper.getName());
+        markPaperVO.setSuggestTime(examPaper.getSuggestTime());
+        return Result.ok().data(markPaperVO);
+    }
+
 }

--
Gitblit v1.8.0