qirong
2023-07-05 21ff1b4f2ef67975eef303bff66ef60388243cf1
src/main/java/com/mindskip/xzs/service/impl/ExamPaperServiceImpl.java
@@ -19,6 +19,7 @@
import com.mindskip.xzs.viewmodel.admin.exam.ExamPaperEditRequestVM;
import com.mindskip.xzs.viewmodel.admin.exam.ExamPaperPageRequestVM;
import com.mindskip.xzs.viewmodel.admin.exam.ExamPaperTitleItemVM;
import com.mindskip.xzs.viewmodel.admin.exam.QuestionTypeVM;
import com.mindskip.xzs.viewmodel.admin.question.QuestionEditRequestVM;
import com.mindskip.xzs.viewmodel.student.dashboard.PaperFilter;
import com.mindskip.xzs.viewmodel.student.dashboard.PaperInfo;
@@ -92,9 +93,10 @@
        List<ExamPaperTitleItemObject> frameTextContentList = new ArrayList<>();
        List<ExamPaperTitleItemVM> titleItemsVM = new ArrayList<>();
        //随机试卷
        if (examPaperEditRequestVM.getSubjectSource().size() != 0) {
        if (examPaperEditRequestVM.getQuestionTypeVMS().size() != 0) {
//            Map<Integer, Integer> questionList = questionService.getAll().stream().collect(Collectors.toMap(Question::getId, Question::getScore));
            randomQuestion(examPaperEditRequestVM, frameTextContentList, titleItemsVM);
//            randomQuestion(examPaperEditRequestVM, frameTextContentList, titleItemsVM);
            randomQuestionType(examPaperEditRequestVM, frameTextContentList, titleItemsVM);
        }
        if (titleItemsVM.size() == 0) {
            titleItemsVM = examPaperEditRequestVM.getTitleItems();
@@ -339,7 +341,7 @@
        Integer order = 0;
        for (Integer key : subjectSource.keySet()) {    // key:数量
            //该标签对应的分数   多选:3 判断:3 单选:4
            Integer source = 80 * subjectSource.get(key) / sum - mark;
            Integer source = 100 * subjectSource.get(key) / sum - mark;
            // 多选和判断数量
            Integer multipleNumber = (subjectSource.get(key) + count) * 3 / 10;
            //多选和判断分数
@@ -404,6 +406,89 @@
    }
    /**
     * 随机试卷
     *
     * @param examPaperEditRequestVM 传参
     * @param frameTextContentList
     * @param titleItemsVM           title
     */
    private void randomQuestionType(ExamPaperEditRequestVM examPaperEditRequestVM, List<ExamPaperTitleItemObject> frameTextContentList, List<ExamPaperTitleItemVM> titleItemsVM) throws QuestionException {
        //单选
        Integer singleChoice = examPaperEditRequestVM.getQuestionTypeVMS().stream().mapToInt(QuestionTypeVM::getSingleChoice).sum();
        //多选
        Integer multipleChoice = examPaperEditRequestVM.getQuestionTypeVMS().stream().mapToInt(QuestionTypeVM::getMultipleChoice).sum();
        //判断
        Integer judgment = examPaperEditRequestVM.getQuestionTypeVMS().stream().mapToInt(QuestionTypeVM::getTrueFalse).sum();
        if ((singleChoice * 4 + multipleChoice * 5 + judgment * 2) != 100) {
            throw new QuestionException();
        }
        ExamPaperTitleItemObject examPaperTitleItemObject = new ExamPaperTitleItemObject();
        examPaperTitleItemObject.setName(examPaperEditRequestVM.getTitleItems().get(0).getName());
        ExamPaperTitleItemVM examPaperTitleItemVM = new ExamPaperTitleItemVM();
        //titleItemsVM
        examPaperTitleItemVM.setName(examPaperEditRequestVM.getTitleItems().get(0).getName());
        List<ExamPaperQuestionItemObject> examPaperQuestionItemObjectList = new ArrayList<>();
        List<QuestionEditRequestVM> questionItems = new ArrayList<>();
        List<QuestionTypeVM> questionTypeVMList = examPaperEditRequestVM.getQuestionTypeVMS();
        Integer order = 0;
        for (QuestionTypeVM questionTypeVM : questionTypeVMList) {
            List<Integer> questions = questionSubjectService.getSubject(questionTypeVM.getSubjectId())
                    .stream().map(QuestionSubject::getQuestionId).collect(Collectors.toList());
            List<Question> list = questionService.selectByIds(questions);
            Map<Integer, Integer> multiple = new HashMap<>();
            //多选
            Map<Integer, Integer> multipleMap = list.stream()
                    .filter(e -> e.getQuestionType().equals(QuestionTypeEnum.MultipleChoice.getCode()))
                    .collect(Collectors.toMap(Question::getId, Question::getScore));
            Integer multipleSource = questionTypeVM.getMultipleChoice() * 5;
            selectRandomScores(multiple, multipleMap, questionTypeVM.getMultipleChoice(), multipleSource);
            //判断
            Map<Integer, Integer> judgmentMap = list.stream()
                    .filter(e -> e.getQuestionType().equals(QuestionTypeEnum.TrueFalse.getCode()))
                    .collect(Collectors.toMap(Question::getId, Question::getScore));
            Integer trueFalse = questionTypeVM.getTrueFalse() * 2;
            selectRandomScores(multiple, judgmentMap, questionTypeVM.getTrueFalse(), trueFalse);
            //单选分数
            Integer radioSource = questionTypeVM.getSingleChoice() * 4;
            //单选
            Map<Integer, Integer> radioMap = list.stream()
                    .filter(e -> e.getQuestionType().equals(QuestionTypeEnum.SingleChoice.getCode()))
                    .collect(Collectors.toMap(Question::getId, Question::getScore));
            selectRandomScores(multiple, radioMap, questionTypeVM.getSingleChoice(), radioSource);
//            titleItemsVM.add(examPaperTitleItemVM);
            for (Integer k : multiple.keySet()) {
                ExamPaperQuestionItemObject examPaperQuestionItemObject = new ExamPaperQuestionItemObject();
                examPaperQuestionItemObject.setId(k);
                examPaperQuestionItemObject.setItemOrder(order++);
                examPaperQuestionItemObjectList.add(examPaperQuestionItemObject);
                //titleItemsVM
                QuestionEditRequestVM questionEditRequestVM = new QuestionEditRequestVM();
                questionEditRequestVM.setScore(multiple.get(k).toString());
                questionItems.add(questionEditRequestVM);
            }
            examPaperTitleItemObject.setQuestionItems(examPaperQuestionItemObjectList);
            //titleItemsVM
            examPaperTitleItemVM.setQuestionItems(questionItems);
        }
        frameTextContentList.add(examPaperTitleItemObject);
        titleItemsVM.add(examPaperTitleItemVM);
    }
    public Integer getRandomNumber(Integer a, Set<Integer> generatedNumbers, Random random) {
        if (a <= 0) {
            throw new IllegalArgumentException("a必须为正整数");