龚焕茏
2024-05-07 49429bad1036c81c056faeadfa009c53ba777fad
src/main/java/com/mindskip/xzs/service/impl/ExamPaperServiceImpl.java
@@ -8,17 +8,18 @@
import com.mindskip.xzs.domain.exam.ExamPaperQuestionItemObject;
import com.mindskip.xzs.domain.exam.ExamPaperTitleItemObject;
import com.mindskip.xzs.domain.other.KeyValue;
import com.mindskip.xzs.domain.vo.PaperExcelVO;
import com.mindskip.xzs.repository.ExamPaperMapper;
import com.mindskip.xzs.repository.QuestionMapper;
import com.mindskip.xzs.repository.UserDepartmentMapper;
import com.mindskip.xzs.service.*;
import com.mindskip.xzs.service.enums.ActionEnum;
import com.mindskip.xzs.utility.DateTimeUtil;
import com.mindskip.xzs.utility.JsonUtil;
import com.mindskip.xzs.utility.ModelMapperSingle;
import com.mindskip.xzs.utility.ExamUtil;
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.*;
import com.mindskip.xzs.viewmodel.admin.question.ExamQuestionVO;
import com.mindskip.xzs.viewmodel.admin.question.QuestionEditRequestVM;
import com.mindskip.xzs.viewmodel.student.dashboard.PaperFilter;
import com.mindskip.xzs.viewmodel.student.dashboard.PaperInfo;
@@ -29,6 +30,7 @@
import com.mindskip.xzs.domain.Question;
import com.mindskip.xzs.domain.User;
import org.modelmapper.ModelMapper;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -49,9 +51,15 @@
    private final ExamPaperDepartmentService examPaperDepartmentService;
    private final ExamPaperSubjectService examPaperSubjectService;
    private final QuestionSubjectService questionSubjectService;
    private final ExamPaperUserService examPaperUserService;
    private final UserService userService;
    private final UserDepartmentMapper userDepartmentMapper;
    private final DepartmentService departmentService;
    @Autowired
    public ExamPaperServiceImpl(ExamPaperMapper examPaperMapper, QuestionMapper questionMapper, TextContentService textContentService, QuestionService questionService, SubjectService subjectService, ExamPaperDepartmentService examPaperDepartmentService, ExamPaperSubjectService examPaperSubjectService, QuestionSubjectService questionSubjectService) {
    public ExamPaperServiceImpl(ExamPaperMapper examPaperMapper, QuestionMapper questionMapper, TextContentService textContentService, QuestionService questionService, SubjectService subjectService, ExamPaperDepartmentService examPaperDepartmentService, ExamPaperSubjectService examPaperSubjectService, QuestionSubjectService questionSubjectService, ExamPaperUserService examPaperUserService, UserService userService, UserDepartmentMapper userDepartmentMapper, DepartmentService departmentService) {
        super(examPaperMapper);
        this.examPaperMapper = examPaperMapper;
        this.questionMapper = questionMapper;
@@ -61,6 +69,10 @@
        this.examPaperDepartmentService = examPaperDepartmentService;
        this.examPaperSubjectService = examPaperSubjectService;
        this.questionSubjectService = questionSubjectService;
        this.examPaperUserService = examPaperUserService;
        this.userService = userService;
        this.userDepartmentMapper = userDepartmentMapper;
        this.departmentService = departmentService;
    }
@@ -92,9 +104,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();
@@ -114,6 +127,7 @@
            examPaper.setCreateTime(now);
            examPaper.setCreateUser(user.getId());
            examPaper.setDeleted(false);
            examPaper.setUserIds(examPaperEditRequestVM.getMenuIds());
            examPaperFromVM(examPaperEditRequestVM, examPaper, titleItemsVM);
            examPaperMapper.insertSelective(examPaper);
@@ -129,16 +143,18 @@
            examPaperDepartmentService.removeByExamPaperId(examPaper.getId());
            examPaperSubjectService.removeByExamPaperId(examPaper.getId());
        }
        addExamPaperDepartment(examPaperEditRequestVM, examPaper);
//        addExamPaperDepartment(examPaperEditRequestVM, examPaper);
        addExamPaperUser(examPaperEditRequestVM, examPaper);    //批量添加试卷关联用户
        addExamPaperSubject(examPaperEditRequestVM, examPaper);
        return examPaper;
    }
    @Override
    public ExamPaperEditRequestVM examPaperToVM(Integer id) {
    public ExamPaperEditRequestVO examPaperToVM(Integer id) {
        ExamPaper examPaper = examPaperMapper.selectByPrimaryKey(id);
        ExamPaperEditRequestVM vm = modelMapper.map(examPaper, ExamPaperEditRequestVM.class);
        ExamPaperEditRequestVO vm = modelMapper.map(examPaper, ExamPaperEditRequestVO.class);
        vm.setLevel(examPaper.getGradeLevel());
        vm.setMenuIds(examPaper.getUserIds());
        TextContent frameTextContent = textContentService.selectById(examPaper.getFrameTextContentId());
        List<ExamPaperTitleItemObject> examPaperTitleItemObjects = JsonUtil.toJsonListObject(frameTextContent.getContent(), ExamPaperTitleItemObject.class);
        List<Integer> questionIds = examPaperTitleItemObjects.stream()
@@ -146,17 +162,29 @@
                        .map(q -> q.getId()))
                .collect(Collectors.toList());
        List<Question> questions = questionMapper.selectByIds(questionIds);
        //单选数量
        Integer singleChoice = questions.stream().filter(e -> e.getQuestionType() == 1).collect(Collectors.toList()).size();
        //多选数量
        Integer multipleChoice = questions.stream().filter(e -> e.getQuestionType() == 2).collect(Collectors.toList()).size();
        //判断数量
        Integer trueFalse = questions.stream().filter(e -> e.getQuestionType() == 3).collect(Collectors.toList()).size();
        Integer order = 0;
        Set<Integer> generatedNumbers = new HashSet<>();
        Random random = new Random();
        List<ExamPaperTitleItemVM> examPaperTitleItemVMS = examPaperTitleItemObjects.stream().map(t -> {
            ExamPaperTitleItemVM tTitleVM = modelMapper.map(t, ExamPaperTitleItemVM.class);
            List<QuestionEditRequestVM> questionItemsVM = t.getQuestionItems().stream().map(i -> {
        List<ExamPaperTitleItemVO> examPaperTitleItemVMS = examPaperTitleItemObjects.stream().map(t -> {
            ExamPaperTitleItemVO tTitleVM = new ExamPaperTitleItemVO();
            BeanUtils.copyProperties(t, tTitleVM);
            List<ExamQuestionVO> questionItemsVM = t.getQuestionItems().stream().map(i -> {
                        Question question = questions.stream().filter(q -> q.getId().equals(i.getId())).findFirst().get();
                        QuestionEditRequestVM questionEditRequestVM = questionService.getQuestionEditRequestVM(question);
                        questionEditRequestVM.setItemOrder(getRandomNumber(t.getQuestionItems().size() - 1, generatedNumbers, random));
                        ExamQuestionVO questionEditRequestVM = questionService.getQuestionEditRequestVM(question);
                        questionEditRequestVM.setTitle("(" + QuestionTypeEnum.fromCode(questionEditRequestVM.getQuestionType()).getName() + ") " + questionEditRequestVM.getTitle());
                        questionEditRequestVM.setItemOrder(generateRandomNumber(questionEditRequestVM.getQuestionType() == 1 ? 0 : ((questionEditRequestVM.getQuestionType() == 2 ? singleChoice : multipleChoice + singleChoice)),
                                questionEditRequestVM.getQuestionType() == 1 ? singleChoice : ((questionEditRequestVM.getQuestionType() == 2 ? multipleChoice + singleChoice : trueFalse + multipleChoice + singleChoice)),
                                generatedNumbers, random));
//                        questionEditRequestVM.setItemOrder(getRandomNumber(t.getQuestionItems().size() - 1, generatedNumbers, random));
                        return questionEditRequestVM;
                    }).sorted(Comparator.comparing(QuestionEditRequestVM::getItemOrder))
                    }).sorted(Comparator.comparing(ExamQuestionVO::getItemOrder))
                    .collect(Collectors.toList());
            tTitleVM.setQuestionItems(questionItemsVM);
            return tTitleVM;
@@ -173,6 +201,13 @@
                .stream().map(ExamPaperSubject::getSubjectId).toArray(Integer[]::new));
        vm.setDepartmentIds(examPaperDepartmentService.getByExamPaperId(examPaper.getId())
                .stream().map(ExamPaperDepartment::getDepartmentId).toArray(Integer[]::new));
        List<ExamPaperUser> examPaperUsers = examPaperUserService.getByExamPaperId(examPaper.getId());
        Integer[][] userIds = new Integer[examPaperUsers.size()][2];
        for (int i = 0; i < examPaperUsers.size(); i++) {
            Integer[] userId = {userService.getUserById(examPaperUsers.get(i).getUserId()).getUserLevel(), examPaperUsers.get(i).getUserId()};
            userIds[i] = userId;
        }
        vm.setUserId(userIds);
        return vm;
    }
@@ -207,6 +242,22 @@
    @Override
    public List<ExamPaper> gets(Integer[] ids) {
        return examPaperMapper.gets(ids);
    }
    @Override
    public List<PaperExcelVO> getPaperExcelById(Integer id) {
        List<PaperExcelVO> paperExcel = examPaperMapper.getPaperExcelById(id);
        paperExcel = paperExcel.stream().map(e->{
            e.setPaperScore(ExamUtil.scoreToVM(Integer.parseInt(e.getPaperScore())));
            e.setUserScore(ExamUtil.scoreToVM(Integer.parseInt(e.getUserScore())));
            List<UserDepartment> userDepartments = userDepartmentMapper.selectByUserId(Integer.parseInt(e.getUserId()));
            if(userDepartments.size() != 0){
                Department byId = departmentService.getById(userDepartments.get(0).getDepartmentId());
                e.setDepartmentName(byId.getName());
            }
            return e;
        }).collect(Collectors.toList());
        return paperExcel;
    }
    private void examPaperFromVM(ExamPaperEditRequestVM examPaperEditRequestVM, ExamPaper examPaper, List<ExamPaperTitleItemVM> titleItemsVM) {
@@ -244,7 +295,7 @@
    }
    private void addExamPaperDepartment(ExamPaperEditRequestVM examPaperEditRequestVM, ExamPaper examPaper) {
        if(examPaperEditRequestVM.getDepartmentIds().length==0){
        if (examPaperEditRequestVM.getDepartmentIds().length == 0) {
            return;
        }
        List<ExamPaperDepartment> list = Arrays.asList(examPaperEditRequestVM.getDepartmentIds()).stream().map(e -> {
@@ -257,7 +308,27 @@
        examPaperDepartmentService.saves(list);
    }
    private void addExamPaperUser(ExamPaperEditRequestVM examPaperEditRequestVM, ExamPaper examPaper) {
        if (examPaperEditRequestVM.getUserIds().length == 0) {
            return;
        }
        if (examPaperUserService.getByExamPaperId(examPaper.getId()).size() > 0) {
            examPaperUserService.removeByExamPaperId(examPaper.getId());
        }
        List<ExamPaperUser> list = Arrays.asList(examPaperEditRequestVM.getUserIds()).stream().map(e -> {
            ExamPaperUser examPaperUser = new ExamPaperUser();
            examPaperUser.setUserId(e);
            examPaperUser.setExamPaperId(examPaper.getId());
            examPaperUser.setDeleted("0");
            return examPaperUser;
        }).collect(Collectors.toList());
        examPaperUserService.saves(list);
    }
    private void addExamPaperSubject(ExamPaperEditRequestVM examPaperEditRequestVM, ExamPaper examPaper) {
        if (examPaperSubjectService.getByExamPaperId(examPaper.getId()).size() > 0) {
            examPaperSubjectService.removeByExamPaperId(examPaper.getId());
        }
        List<ExamPaperSubject> subjectList = Arrays.asList(examPaperEditRequestVM.getSubjectId()).stream().map(e -> {
            ExamPaperSubject examPaperSubject = new ExamPaperSubject();
            examPaperSubject.setSubjectId(e);
@@ -289,6 +360,7 @@
        int remainingScore = totalScore;
        for (int i = 0; i < quantity - 1; i++) {
            // 如果题数量超过了题库数量,报错
            if (i >= scoresMap.size()) {
                throw new QuestionException();
            }
@@ -303,7 +375,6 @@
                keys.remove(index);
            }
        }
        if (!values.isEmpty()) {
            int index = random.nextInt(values.size());
            int score = values.get(index);
@@ -319,7 +390,7 @@
     * @param frameTextContentList
     * @param titleItemsVM           title
     */
    private void randomQuestion(ExamPaperEditRequestVM examPaperEditRequestVM, List<ExamPaperTitleItemObject> frameTextContentList, List<ExamPaperTitleItemVM> titleItemsVM) throws QuestionException {
    private void randomQuesrandomQuestiontion(ExamPaperEditRequestVM examPaperEditRequestVM, List<ExamPaperTitleItemObject> frameTextContentList, List<ExamPaperTitleItemVM> titleItemsVM) throws QuestionException {
        Map<Integer, Integer> subjectSource = examPaperEditRequestVM.getSubjectSource();
        //总数量
        Integer sum = subjectSource.values().stream().mapToInt(Integer::intValue).sum();
@@ -339,7 +410,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 +475,93 @@
    }
    /**
     * 随机试卷
     *
     * @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 * 2 + multipleChoice * 2 + judgment * 2) != new Integer(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() * 2;
            selectRandomScores(multiple, multipleMap, questionTypeVM.getMultipleChoice(), multipleSource);
            //判断
            List<Question> collect1 = list.stream().filter(e -> e.getQuestionType().equals(QuestionTypeEnum.TrueFalse.getCode())).collect(Collectors.toList());
            Map<Integer, Integer> judgmentMap = collect1.stream().collect(Collectors.toMap(Question::getId, Question::getScore));
            Integer trueFalse1 = questionTypeVM.getTrueFalse();
            Integer trueFalse = trueFalse1 * 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必须为正整数");
@@ -423,4 +581,22 @@
        generatedNumbers.add(randomNumber);
        return randomNumber;
    }
    /**
     * 两个数之前的随机数(不重复)
     *
     * @param a
     * @param b
     * @return
     */
    public static int generateRandomNumber(Integer a, Integer b, Set<Integer> generatedNumbers, Random random) {
        int randomNumber = random.nextInt(b - a) + a;
        while (generatedNumbers.contains(randomNumber)) {
            randomNumber = random.nextInt(b - a) + a;
        }
        generatedNumbers.add(randomNumber);
        return randomNumber;
    }
}