Jelajahi Sumber

试卷组卷方式增加抽题组卷

yangfeng 1 tahun lalu
induk
melakukan
491c5172f4

+ 1 - 1
web/src/main/java/com/ynfy/buss/exam/exam/service/impl/ExamServiceImpl.java

@@ -156,7 +156,7 @@ public class ExamServiceImpl extends ServiceImpl<ExamMapper, Exam> implements IE
             throw new JeecgBootException("试卷不存在!");
         }
         List<PaperQuestion> paperQuestionList = null;
-        if (paper.getJoinType().equals(JoinType.XT.getCode())) {//选题
+        if (paper.getJoinType().equals(JoinType.XT.getCode()) || paper.getJoinType().equals(JoinType.CT.getCode())) {//选题或者抽题
             paperQuestionList = paperQuestionService.listByPaperId(paper.getId());
             //题目乱序
             if (!Objects.isNull(exam.getQuestionDisorder()) && exam.getQuestionDisorder()) {

+ 12 - 0
web/src/main/java/com/ynfy/buss/exam/paper/controller/PaperController.java

@@ -142,4 +142,16 @@ public class PaperController extends JeecgController<Paper, IPaperService> {
         return Result.OK(examService.checkIsUsedInExam(id));
     }
 
+    /**
+     * 随机组卷抽取部分试题
+     *
+     * @return
+     */
+    @AutoLog(value = "随机组卷抽取部分试题")
+    @ApiOperation(value = "随机组卷抽取部分试题", notes = "随机组卷抽取部分试题")
+    @PostMapping(value = "/extractPartQuestion")
+    public Result<?> extractPartQuestion(String ruleDetail, String questionIds) {
+        return Result.OK(paperService.extractPartQuestion(ruleDetail, questionIds));
+    }
+
 }

+ 9 - 0
web/src/main/java/com/ynfy/buss/exam/paper/service/IPaperService.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.ynfy.buss.exam.paper.dto.PaperDTO;
 import com.ynfy.buss.exam.paper.entity.Paper;
 import com.ynfy.buss.exam.paperquestion.entity.PaperQuestion;
+import com.ynfy.buss.exam.question.entity.Question;
 
 import java.util.List;
 
@@ -40,4 +41,12 @@ public interface IPaperService extends IService<Paper> {
 
 
     void removeBatch(String ids);
+
+
+    /**
+     * 随机组卷抽取部分试题
+     *
+     * @return
+     */
+    List<Question> extractPartQuestion(String ruleDetail, String questionIds);
 }

+ 40 - 1
web/src/main/java/com/ynfy/buss/exam/paper/service/impl/PaperServiceImpl.java

@@ -1,5 +1,6 @@
 package com.ynfy.buss.exam.paper.service.impl;
 
+import com.alibaba.fastjson.JSONArray;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ynfy.buss.exam.paper.dto.PaperDTO;
 import com.ynfy.buss.exam.paper.enmus.JoinType;
@@ -16,6 +17,7 @@ import com.ynfy.buss.exam.paperruledetail.service.IPaperRuleDetailService;
 import com.ynfy.buss.exam.paperrulegroup.entity.PaperRuleGroup;
 import com.ynfy.buss.exam.paperrulegroup.service.IPaperRuleGroupService;
 import com.ynfy.buss.exam.question.dto.QuestionConditionDTO;
+import com.ynfy.buss.exam.question.dto.QuestionDTO;
 import com.ynfy.buss.exam.question.entity.Question;
 import com.ynfy.buss.exam.question.enums.QuestionType;
 import com.ynfy.buss.exam.question.service.IQuestionService;
@@ -312,7 +314,7 @@ public class PaperServiceImpl extends ServiceImpl<PaperMapper, Paper> implements
         PaperDTO paperDTO = new PaperDTO();
         BeanUtils.copyProperties(paper, paperDTO);
         if (!CollectionUtils.isEmpty(groups)) {
-            if (paper.getJoinType().equals(JoinType.XT.getCode())) {
+            if (paper.getJoinType().equals(JoinType.XT.getCode()) || paper.getJoinType().equals(JoinType.CT.getCode())) {
                 joinTypeOfSelect(paperId, groups);
             } else if (paper.getJoinType().equals(JoinType.SJ.getCode())) {
                 joinTypeOfRandom(groups);
@@ -446,4 +448,41 @@ public class PaperServiceImpl extends ServiceImpl<PaperMapper, Paper> implements
         paperRuleDetailService.removeByQuestionIds(idArr);
         removeByIds(Arrays.asList(idArr));
     }
+
+    /**
+     * 随机组卷抽取部分试题
+     *
+     * @return
+     */
+    @Override
+    public List<Question> extractPartQuestion(String ruleDetail, String questionIds) {
+        List<QuestionDTO> questionDTOS = JSONArray.parseArray(ruleDetail, QuestionDTO.class);
+        List<PaperRuleDetail> ruleDetailList = new ArrayList<>();
+        questionDTOS.forEach(dto -> {
+            PaperRuleDetail detail = new PaperRuleDetail();
+            BeanUtils.copyProperties(dto, detail);
+            detail.setQuestionType(dto.getType());
+            ruleDetailList.add(detail);
+        });
+        //生成题目查询条件
+        List<QuestionConditionDTO> dtoList = generateQuestionCondition(ruleDetailList);
+        List<Question> ruleQuestions = questionService.listQuestionByCondition(dtoList);
+
+        if (StringUtils.isNotBlank(questionIds)) {
+            List<String> questionIdList = Arrays.asList(questionIds.split(","));
+            ruleQuestions = ruleQuestions.stream().filter(rq -> !questionIdList.contains(rq.getId())).collect(Collectors.toList());
+        }
+        List<Question> questionList = new ArrayList<>();
+        if (!CollectionUtils.isEmpty(ruleDetailList)) {
+            for (PaperRuleDetail detail : ruleDetailList) {
+                questionList.addAll(questionService.generateQuestionsByRule(detail.getRepositoryId(), detail.getQuestionType(),
+                        detail.getLevel(), detail.getNum(), ruleQuestions));
+            }
+        }
+        if (!CollectionUtils.isEmpty(questionList)) {
+            List<String> idList = questionList.stream().map(Question::getId).collect(Collectors.toList());
+            return questionService.selectQuestionList(idList, true, false);
+        }
+        return null;
+    }
 }

+ 6 - 0
web/src/main/java/com/ynfy/buss/exam/paperruledetail/dto/RuleDetailDTO.java

@@ -12,4 +12,10 @@ public class RuleDetailDTO {
 
     //规则集合字符串
     private String ruleList;
+
+    //题目id集合
+    private String questionIds;
+
+    //组卷类型
+    private Integer joinType;
 }

+ 1 - 1
web/src/main/java/com/ynfy/buss/exam/paperrulegroup/service/impl/PaperRuleGroupServiceImpl.java

@@ -64,7 +64,7 @@ public class PaperRuleGroupServiceImpl extends ServiceImpl<PaperRuleGroupMapper,
         if (!CollectionUtils.isEmpty(groupList)) {
             if (paper.getJoinType().equals(JoinType.SJ.getCode())) {//随机组卷
                 saveRandom(paper, groupList);
-            } else if (paper.getJoinType().equals(JoinType.XT.getCode())) {//选题组卷
+            } else if (paper.getJoinType().equals(JoinType.XT.getCode()) || paper.getJoinType().equals(JoinType.CT.getCode())) {//选题组卷或者抽题组卷
                 saveSelect(paper, groupList);
             }
         }

+ 24 - 13
web/src/main/java/com/ynfy/buss/exam/question/controller/QuestionController.java

@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ynfy.buss.exam.paper.enmus.JoinType;
 import com.ynfy.buss.exam.paperquestion.service.IPaperQuestionService;
 import com.ynfy.buss.exam.paperruledetail.dto.RuleDetailDTO;
 import com.ynfy.buss.exam.paperruledetail.entity.PaperRuleDetail;
@@ -21,6 +22,7 @@ import org.apache.commons.lang.StringUtils;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.exception.JeecgBootException;
 import org.jeecg.common.system.base.controller.JeecgController;
 import org.jeecg.common.system.query.QueryGenerator;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -202,24 +204,33 @@ public class QuestionController extends JeecgController<Question, IQuestionServi
      */
     @ApiOperation(value = "题目-按照难度分组查询", notes = "题目-按照难度分组查询")
     @PostMapping(value = "/groupLevelById")
-    public Result<List<QuestionDTO>> groupLevelById(@RequestBody RuleDetailDTO ruleDetailDTO) {
-        if (StringUtils.isBlank(ruleDetailDTO.getRepositoryIds())) {
+    public Result<List<QuestionDTO>> groupLevelById(@RequestBody RuleDetailDTO dto) {
+        if (StringUtils.isBlank(dto.getRepositoryIds())) {
             return Result.OK();
         }
-        List<QuestionDTO> questionDTOs = questionService.groupLevelById(Arrays.asList(ruleDetailDTO.getRepositoryIds()
-                .split(",")), ruleDetailDTO.getType());
-        if (!StringUtils.isEmpty(ruleDetailDTO.getRuleList())) {
-            List<PaperRuleDetail> ruleDetails = JSONObject.parseArray(JSON.toJSON(ruleDetailDTO.getRuleList()).toString(), PaperRuleDetail.class);
-            if (!CollectionUtils.isEmpty(ruleDetails)) {
-                ruleDetails.stream().forEach(rule -> {
-                    for (QuestionDTO tmp : questionDTOs) {
-                        if (tmp.getRepositoryId().equals(rule.getRepositoryId()) && tmp.getType().equals(ruleDetailDTO.getType())
-                                && tmp.getLevel().equals(rule.getLevel())) {
-                            tmp.setNum(rule.getNum());
+        if (Objects.isNull(dto.getJoinType())) {
+            throw new JeecgBootException("组卷方式不能为空");
+        }
+        List<QuestionDTO> questionDTOs = null;
+        if (JoinType.SJ.getCode().equals(dto.getJoinType())) {//随机组卷
+            questionDTOs = questionService.groupLevelById(Arrays.asList(dto.getRepositoryIds().split(",")), dto.getType(), null);
+            if (!StringUtils.isEmpty(dto.getRuleList())) {
+                List<PaperRuleDetail> ruleDetails = JSONObject.parseArray(JSON.toJSON(dto.getRuleList()).toString(), PaperRuleDetail.class);
+                if (!CollectionUtils.isEmpty(ruleDetails)) {
+                    for (PaperRuleDetail rule : ruleDetails) {
+                        for (QuestionDTO tmp : questionDTOs) {
+                            if (tmp.getRepositoryId().equals(rule.getRepositoryId()) && tmp.getType().equals(dto.getType())
+                                    && tmp.getLevel().equals(rule.getLevel())) {
+                                tmp.setNum(rule.getNum());
+                                break;
+                            }
                         }
                     }
-                });
+                }
             }
+        } else if (JoinType.CT.getCode().equals(dto.getJoinType())) {//抽题组卷
+            questionDTOs = questionService.groupLevelById(Arrays.asList(dto.getRepositoryIds().split(",")),
+                    dto.getType(), StringUtils.isNotBlank(dto.getQuestionIds()) ? Arrays.asList(dto.getQuestionIds().split(",")) : null);
         }
         return Result.OK(questionDTOs);
     }

+ 2 - 1
web/src/main/java/com/ynfy/buss/exam/question/mapper/QuestionMapper.java

@@ -40,7 +40,8 @@ public interface QuestionMapper extends BaseMapper<Question> {
                                               @Param("needAnswerFlag") boolean needAnswerFlag, @Param("needAnalysis") boolean needAnalysis,
                                               @Param("needPathScore") boolean needPathScore, @Param("needSubjective") boolean needSubjective);
 
-    List<QuestionDTO> groupLevelById(@Param("repositoryIds") List<String> repositoryIds, @Param("type") Integer type);
+    List<QuestionDTO> groupLevelById(@Param("repositoryIds") List<String> repositoryIds,
+                                     @Param("type") Integer type, @Param("questionIds") List<String> questionIds);
 
     List<Question> listByPaperId(String paperId);
 

+ 6 - 0
web/src/main/java/com/ynfy/buss/exam/question/mapper/xml/QuestionMapper.xml

@@ -198,6 +198,12 @@
                         <if test="type !=null">
                             AND type = #{type,jdbcType=INTEGER}
                         </if>
+                        <if test="questionIds !=null and questionIds.size()>0">
+                            AND id NOT IN
+                            <foreach collection="questionIds" item="item" open="(" separator="," close=")">
+                                #{item}
+                            </foreach>
+                        </if>
                 </where>
                 GROUP BY
                     repository_id,

+ 1 - 1
web/src/main/java/com/ynfy/buss/exam/question/service/IQuestionService.java

@@ -61,7 +61,7 @@ public interface IQuestionService extends IService<Question> {
     List<Question> selectQuestionList(List<String> idList, boolean needAnswerFlag, boolean needAnalysis);
 
 
-    List<QuestionDTO> groupLevelById(List<String> repositoryIds, Integer type);
+    List<QuestionDTO> groupLevelById(List<String> repositoryIds, Integer type, List<String> questionIds);
 
 
     List<Question> listByPaperId(String paperId);

+ 2 - 2
web/src/main/java/com/ynfy/buss/exam/question/service/impl/QuestionServiceImpl.java

@@ -479,8 +479,8 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
     }
 
     @Override
-    public List<QuestionDTO> groupLevelById(List<String> repositoryIds, Integer type) {
-        return questionMapper.groupLevelById(repositoryIds, type);
+    public List<QuestionDTO> groupLevelById(List<String> repositoryIds, Integer type, List<String> questionIds) {
+        return questionMapper.groupLevelById(repositoryIds, type, questionIds);
     }
 
     @Override