xiangpei
2025-05-14 47cd9ecc0eff38ffe6b3b794b2bf197e958f4403
src/main/java/com/mindskip/xzs/service/impl/QuestionServiceImpl.java
@@ -1,5 +1,8 @@
package com.mindskip.xzs.service.impl;
import com.alibaba.fastjson.JSON;
import com.mindskip.xzs.base.RestResponse;
import com.mindskip.xzs.domain.DeptQuestion;
import com.mindskip.xzs.domain.QuestionSubject;
import com.mindskip.xzs.domain.other.KeyValue;
import com.mindskip.xzs.domain.Question;
@@ -8,16 +11,18 @@
import com.mindskip.xzs.domain.enums.QuestionTypeEnum;
import com.mindskip.xzs.domain.question.QuestionItemObject;
import com.mindskip.xzs.domain.question.QuestionObject;
import com.mindskip.xzs.domain.vo.DeptQuestionVO;
import com.mindskip.xzs.domain.vo.QuestionContentVO;
import com.mindskip.xzs.domain.vo.QuestionVO;
import com.mindskip.xzs.repository.BaseMapper;
import com.mindskip.xzs.repository.DeptQuestionMapper;
import com.mindskip.xzs.repository.QuestionMapper;
import com.mindskip.xzs.repository.SubjectMapper;
import com.mindskip.xzs.service.QuestionService;
import com.mindskip.xzs.service.QuestionSubjectService;
import com.mindskip.xzs.service.SubjectService;
import com.mindskip.xzs.service.TextContentService;
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.utility.*;
import com.mindskip.xzs.viewmodel.admin.education.SubjectPageRequestVM;
import com.mindskip.xzs.viewmodel.admin.question.ExamQuestionVO;
import com.mindskip.xzs.viewmodel.admin.question.QuestionEditItemVM;
@@ -25,15 +30,24 @@
import com.mindskip.xzs.viewmodel.admin.question.QuestionPageRequestVM;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.mindskip.xzs.viewmodel.student.question.answer.QuestionPageStudentRequestVM;
import com.mindskip.xzs.viewmodel.student.question.answer.QuestionPageStudentResponseVM;
import com.mindskip.xzs.vo.QuestionExportData;
import com.mindskip.xzs.vo.QuestionExportVO;
import com.mindskip.xzs.vo.QuestionImportVO;
import com.mindskip.xzs.vo.QuestionSubjectVO;
import lombok.RequiredArgsConstructor;
import org.modelmapper.ModelMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
@Service
@@ -45,15 +59,16 @@
    private final SubjectService subjectService;
    private final QuestionSubjectService questionSubjectService;
    private final SubjectMapper subjectMapper;
    private final DeptQuestionMapper deptQuestionMapper;
    @Autowired
    public QuestionServiceImpl(QuestionMapper questionMapper, TextContentService textContentService, SubjectService subjectService, QuestionSubjectService questionSubjectService, SubjectMapper subjectMapper) {
        super(questionMapper);
        this.textContentService = textContentService;
    public QuestionServiceImpl(BaseMapper<Question> baseMapper, QuestionMapper questionMapper, TextContentService textContentService, SubjectService subjectService, QuestionSubjectService questionSubjectService, SubjectMapper subjectMapper, DeptQuestionMapper deptQuestionMapper) {
        super(baseMapper);
        this.questionMapper = questionMapper;
        this.textContentService = textContentService;
        this.subjectService = subjectService;
        this.questionSubjectService = questionSubjectService;
        this.subjectMapper = subjectMapper;
        this.deptQuestionMapper = deptQuestionMapper;
    }
    @Override
@@ -68,16 +83,15 @@
    @Transactional
    public Question insertFullQuestion(QuestionEditRequestVM model, Integer userId) {
        Date now = new Date();
//        Integer gradeLevel = subjectService.levelBySubjectId(model.getSubjectId());
        //题干、解析、选项等 插入
        // 题干、解析、选项等 插入
        TextContent infoTextContent = new TextContent();
        infoTextContent.setCreateTime(now);
        setQuestionInfoFromVM(infoTextContent, model);
        textContentService.insertByFilter(infoTextContent);
        // 题目插入
        Question question = new Question();
//        question.setSubjectId(model.getSubjectId());
        question.setGradeLevel(model.getGradeLevel());
        question.setCreateTime(now);
        question.setQuestionType(model.getQuestionType());
@@ -90,8 +104,21 @@
        question.setDeleted(false);
        questionMapper.insertSelective(question);
        // 题目所属部门插入
        if (! CollectionUtils.isEmpty(model.getDeptIds())) {
            List<DeptQuestion> deptQuestions = model.getDeptIds().stream().map(deptId -> {
                DeptQuestion deptQuestion = new DeptQuestion();
                deptQuestion.setQuestionId(question.getId());
                deptQuestion.setDeptId(deptId);
                return deptQuestion;
            }).collect(Collectors.toList());
            if (! CollectionUtils.isEmpty(model.getDeptIds())) {
                deptQuestionMapper.add(deptQuestions);
            }
        }
        //批量添加
        List<QuestionSubject> list = Arrays.asList(model.getSubjectIds()).stream().map(e->{
        List<QuestionSubject> list = Arrays.asList(model.getSubjectIds()).stream().map(e -> {
            QuestionSubject questionSubject = new QuestionSubject();
            questionSubject.setQuestionId(question.getId());
            questionSubject.setSubjectId(e);
@@ -105,7 +132,8 @@
    @Override
    @Transactional
    public Question updateFullQuestion(QuestionEditRequestVM model) {
//        Integer gradeLevel = subjectService.levelBySubjectId(model.getSubjectId());
        // 题目修改
        Question question = questionMapper.selectByPrimaryKey(model.getId());
        question.setSubjectId(model.getSubjectId());
        question.setGradeLevel(model.getGradeLevel());
@@ -114,6 +142,18 @@
        question.setCorrectFromVM(model.getCorrect(), model.getCorrectArray());
        questionMapper.updateByPrimaryKeySelective(question);
        // 处理题目所属部门
        deptQuestionMapper.remove(question.getId());
        List<DeptQuestion> deptQuestions = model.getDeptIds().stream().map(deptId -> {
            DeptQuestion deptQuestion = new DeptQuestion();
            deptQuestion.setQuestionId(question.getId());
            deptQuestion.setDeptId(deptId);
            return deptQuestion;
        }).collect(Collectors.toList());
        if (! CollectionUtils.isEmpty(model.getDeptIds())) {
            deptQuestionMapper.add(deptQuestions);
        }
        //题干、解析、选项等 更新
        TextContent infoTextContent = textContentService.selectById(question.getInfoTextContentId());
        setQuestionInfoFromVM(infoTextContent, model);
@@ -121,7 +161,7 @@
        questionSubjectService.removeQuestionId(question.getId());
        //批量添加
        List<QuestionSubject> list = Arrays.asList(model.getSubjectIds()).stream().map(e->{
        List<QuestionSubject> list = Arrays.asList(model.getSubjectIds()).stream().map(e -> {
            QuestionSubject questionSubject = new QuestionSubject();
            questionSubject.setQuestionId(question.getId());
            questionSubject.setSubjectId(e);
@@ -135,9 +175,9 @@
    @Override
    public ExamQuestionVO getQuestionEditRequestVM(Integer questionId) {
        //题目映射
        // 题目映射
        Question question = questionMapper.selectByPrimaryKey(questionId);
        List<QuestionSubject> list = questionSubjectService.getQuestion(questionId).stream().map(e->{
        List<QuestionSubject> list = questionSubjectService.getQuestion(questionId).stream().map(e -> {
            SubjectPageRequestVM subject = new SubjectPageRequestVM();
            subject.setId(e.getSubjectId());
            e.setSubName(subjectMapper.page(subject).get(0).getName());
@@ -145,6 +185,10 @@
        }).collect(Collectors.toList());
        ExamQuestionVO questionEditRequestVM = getQuestionEditRequestVM(question);
        questionEditRequestVM.setQuestionSubjects(list);
        // 查询题目所属部门
        List<Integer> deptIds = deptQuestionMapper.deptByQuestionId(questionId)
                .stream().map(DeptQuestionVO::getDeptId).collect(Collectors.toList());
        questionEditRequestVM.setDeptIds(deptIds);
        return questionEditRequestVM;
    }
@@ -235,7 +279,7 @@
        question.setDeleted(true);
        questionMapper.updateByPrimaryKeySelective(question);
        List<Integer> list = questionSubjectService.getQuestion(id)
                .stream().map(e->{
                .stream().map(e -> {
                    return e.getId();
                }).collect(Collectors.toList());
        return questionSubjectService.removes(list.toArray(new Integer[list.size()]));
@@ -253,7 +297,73 @@
    @Override
    public List<QuestionImportVO> export(QuestionPageRequestVM query) {
    public List<QuestionImportVO> export(QuestionExportVO query) {
        return questionMapper.export(query);
    }
    @Override
    public List<QuestionImportVO> exportData(QuestionExportVO query) {
        return questionMapper.exportData(query);
    }
    @Override
    public PageInfo<QuestionPageStudentResponseVM> selectQuestion(QuestionPageStudentRequestVM model) {
        return PageHelper.startPage(model.getPageIndex(), model.getPageSize()).doSelectPageInfo(() ->
                questionMapper.selectQuestion(model).stream().peek(
                        q -> q.setShortTitle(HtmlUtil.clear(q.getShortTitle()))
                ).collect(Collectors.toList())
        );
    }
    @Override
    public RestResponse selectContentById(Integer id) {
        QuestionVO questionVO = questionMapper.selectContentById(id);
        jsonQuestion(questionVO);
        if (QuestionTypeEnum.MultipleChoice.getCode().equals(questionVO.getQuestionType())) {
            // 多选题需要返回答案数量,学员选中对应数量才查询答案
            if (StringUtils.hasText(questionVO.getCorrect())) {
                questionVO.setAnswerNum(questionVO.getCorrect().split(",").length);
            }
        }
        questionVO.setContentJson("");
        questionVO.setCorrect("");
        questionVO.getContent().setCorrect("");
        questionVO.getContent().setAnalyze("");
        return RestResponse.ok(questionVO);
    }
    @Override
    public RestResponse getAnswer(Integer id) {
        QuestionVO questionVO = questionMapper.getAnswer(id);
        if (Objects.nonNull(questionVO) && StringUtils.hasText(questionVO.getCorrect())) {
            QuestionContentVO vo = JSON.parseObject(questionVO.getContentJson(), QuestionContentVO.class);
            vo.setQuestionItemObjects(null);
            vo.setTitleContent(null);
            vo.setCorrect(questionVO.getCorrect());
            return RestResponse.ok(vo);
        }
        return RestResponse.ok(null);
    }
    @Override
    public Integer countQuestionByTitle(String title) {
        return questionMapper.countQuestionByTitle(title);
    }
    @Override
    public List<QuestionSubjectVO> countQuestionByTitleAndSubject(String title, Integer subjectId) {
        return questionMapper.countQuestionByTitleAndSubject(title, subjectId);
    }
    /**
     * 处理题目内容JSON
     *
     * @param vo
     */
    public void jsonQuestion(QuestionVO vo) {
        if (StringUtils.hasText(vo.getContentJson())) {
            QuestionContentVO questionContent = JSON.parseObject(vo.getContentJson(), QuestionContentVO.class);
            vo.setContent(questionContent);
        }
    }
}