gaoxing 8 年 前
コミット
ae2a169e93

+ 1 - 1
cqb-gen-paper/src/main/java/com/qmth/cqb/genpaper/context/DetailContext.java

@@ -20,7 +20,7 @@ public class DetailContext extends Context {
         super(conditions);
         this.detailStruct = detailStruct;
         this.units = new LinkedList<UnitContext>();
-
+        this.paperContext = paperContext;
         for (PaperDetailUnitStruct unit : detailStruct.getPaperDetailUnitStructs()) {
             units.add(new UnitContext(unit, this, conditions));
         }

+ 85 - 136
cqb-gen-paper/src/main/java/com/qmth/cqb/genpaper/service/GenPaperService.java

@@ -7,6 +7,7 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.UUID;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -46,12 +47,6 @@ public class GenPaperService {
     /**
      * 精确组卷,根据设定试卷结构组卷
      * 
-     * @param paperIds
-     *            取题范围
-     * @param paperStruct
-     *            设定的试卷结构
-     * @param conditions
-     *            筛选条件
      * @return
      */
     public Map<String, Object> genPaper(GenPaperDto genPaperDto) {
@@ -126,8 +121,9 @@ public class GenPaperService {
                     dc.getDetailStruct().getName()));
             paperDetailunits.addAll(unitsTemp);
         }
-        Paper paper = this.constuctPaperByPaperDetails(paperDetails, genPaperDto);
-        this.persistentPaper(paperDetails, paperDetailunits, paper);
+
+        Paper paper = this.persistentPaper(paperDetailunits, paperDetails,
+                this.constuctPaperByPaperDetails(paperDetails, genPaperDto));
         msg = "success";
         paperMsgMap.put("paper", paper);
         paperMsgMap.put("msg", msg);
@@ -145,8 +141,7 @@ public class GenPaperService {
         if (paperMap != null && paperMap.size() > 0) {
             for (String paperId : paperMap.keySet()) {
                 Double totalScore = paperMap.get(paperId);
-                Paper oldPaper = paperRepo.findOne(paperId);
-                List<PaperDetailUnit> unitList = unitRepo.findByPaper(oldPaper);
+                List<PaperDetailUnit> unitList = unitRepo.findByPaper(paperRepo.findOne(paperId));
                 Collections.shuffle(unitList);// 随机乱序之后再根据分数取题
                 double sum = 0;
                 for (PaperDetailUnit pdu : unitList) {
@@ -159,12 +154,17 @@ public class GenPaperService {
                 }
             }
         }
-
-        Paper paper = this.constuctPaper(selectedUnits, genPaperDto);
-        msg = "success";
-        paperMsgMap.put("paper", paper);
-        paperMsgMap.put("msg", msg);
-        return paperMsgMap;
+        if (selectedUnits != null && selectedUnits.size() > 0) {
+            Paper paper = this.constuctPaper(selectedUnits, genPaperDto);
+            msg = "success";
+            paperMsgMap.put("paper", paper);
+            paperMsgMap.put("msg", msg);
+            return paperMsgMap;
+        } else {
+            msg = "没有搜索到相应的试题,请检查题源试卷是否有题目";
+            paperMsgMap.put("msg", msg);
+            return paperMsgMap;
+        }
 
     }
 
@@ -178,34 +178,41 @@ public class GenPaperService {
         Map<String, Object> paperMsgMap = new HashMap<String, Object>();
         Map<String, Double> paperMap = genPaperDto.getSimpleParams();
         List<PaperDetailUnit> selectedUnits = new ArrayList<PaperDetailUnit>();// 选中的小题
+        int totalQuesNum = 0;
         if (paperMap != null && paperMap.size() > 0) {
             for (String paperId : paperMap.keySet()) {
                 int unitNum = paperMap.get(paperId).intValue();
-                Paper oldPaper = paperRepo.findOne(paperId);
-                List<PaperDetailUnit> unitList = unitRepo.findByPaper(oldPaper);
+                totalQuesNum += unitNum;
+                List<PaperDetailUnit> tempUnits = new ArrayList<PaperDetailUnit>();
+                List<PaperDetailUnit> unitList = unitRepo.findByPaper(paperRepo.findOne(paperId));
                 Collections.shuffle(unitList);// 随机乱序之后再取题
-                if (unitList.size() >= unitNum) {
-                    for (int i = 0; i < unitNum; i++) {
-                        selectedUnits.add(unitList.get(i));
-                        unitList.remove(i);
+                if (this.getTotalQuesNum(unitList) >= unitNum) {
+                    for (int i = 0; i < unitList.size(); i++) {// 假如unitNum=2,取了第一道题填空题,第二道题是套题,下面有4个子题,就直接进入下一次循环
+                        PaperDetailUnit unit = unitList.get(i);
+                        int quesNum = this.getTotalQuesNum(tempUnits);
+                        if (unit.getQuestionType() == QuesStructType.NESTED_ANSWER_QUESTION
+                                && (unit.getQuestion().getSubQuestions().size() + quesNum) > unitNum) {
+                            continue;
+                        }
+                        if (quesNum < unitNum && (!tempUnits.contains(unit))) {
+                            tempUnits.add(unit);
+                        }
+                        if (tempUnits.size() == unitNum) {
+                            break;
+                        }
+
                     }
+                    selectedUnits.addAll(tempUnits);
                 } else {
                     msg = "题源不足:需要抽取的题目数量要多于试卷中题目数量,请检查";
                     paperMsgMap.put("msg", msg);
                     return paperMsgMap;
                 }
-                for (PaperDetailUnit pdu : selectedUnits) {
-                    if (pdu.getQuestionType().getId() == 6L && pdu.getQuestion().getSubQuestions().size() > 1) {// 假如是套题,要计算下面小题数量
-                        selectedUnits.remove(pdu);// 删除掉这道套题
-                        for (PaperDetailUnit oldPdu : unitList) {
-                            if (pdu.getQuestionType().getId() != 6L) {// 从原来的集合中取一个不是套题的加进去
-                                selectedUnits.add(oldPdu);
-                                break;
-                            }
-                        }
-                    }
-                }
-
+            }
+            if (this.getTotalQuesNum(selectedUnits) < totalQuesNum) {
+                msg = "题源不足:需要抽取的题目数量要多于试卷中题目数量,请检查";
+                paperMsgMap.put("msg", msg);
+                return paperMsgMap;
             }
         }
         Paper paper = this.constuctPaper(selectedUnits, genPaperDto);
@@ -233,6 +240,7 @@ public class GenPaperService {
                 score += pdu.getScore();
 
             }
+            pd.setId(UUID.randomUUID().toString());
             pd.setName(detailName);
             pd.setUnitCount(units.size());
             pd.setScore(score);
@@ -260,6 +268,7 @@ public class GenPaperService {
                 score += pd.getScore();
 
             }
+            paper.setId(UUID.randomUUID().toString());
             paper.setName(genPaperDto.getPaperName());
             paper.setCourseNo(genPaperDto.getCourseNo());
             paper.setCourseName(genPaperDto.getCourseName());
@@ -267,9 +276,6 @@ public class GenPaperService {
             paper.setCreateTime(CommonUtils.getCurDateTime());
             paper.setPaperDetailCount(details.size());
             paper.setTotalScore(score);
-            for (PaperDetail pdu : details) {
-                pdu.setPaper(paper);
-            }
         }
         return paper;
 
@@ -284,106 +290,32 @@ public class GenPaperService {
      * @return
      */
     public Paper constuctPaper(List<PaperDetailUnit> selectedUnits, GenPaperDto genPaperDto) {
-        Paper paper = new Paper();
-        List<PaperDetailUnit> singUnits = new ArrayList<PaperDetailUnit>();
-        List<PaperDetailUnit> multipleUnits = new ArrayList<PaperDetailUnit>();
-        List<PaperDetailUnit> boolUnits = new ArrayList<PaperDetailUnit>();
-        List<PaperDetailUnit> blankUnits = new ArrayList<PaperDetailUnit>();
-        List<PaperDetailUnit> textUnits = new ArrayList<PaperDetailUnit>();
-        List<PaperDetailUnit> nestUnits = new ArrayList<PaperDetailUnit>();
-        for (PaperDetailUnit pdu : selectedUnits) {
-            switch (pdu.getQuestionType()) {
-            case SINGLE_ANSWER_QUESTION:
-                singUnits.add(pdu);
-                break;
-            case MULTIPLE_ANSWER_QUESTION:
-                multipleUnits.add(pdu);
-                break;
-            case BOOL_ANSWER_QUESTION:
-                boolUnits.add(pdu);
-                break;
-            case FILL_BLANK_QUESTION:
-                blankUnits.add(pdu);
-                break;
-            case TEXT_ANSWER_QUESTION:
-                textUnits.add(pdu);
-                break;
-            case NESTED_ANSWER_QUESTION:
-                nestUnits.add(pdu);
-                break;
-
+        Collections.sort(selectedUnits);// 根据大题题型ID排序
+        List<QuesStructType> qsts = new ArrayList<QuesStructType>();
+        for (int i = 0; i < selectedUnits.size(); i++) {
+            if (!qsts.contains(selectedUnits.get(i).getQuestionType())) {
+                qsts.add(selectedUnits.get(i).getQuestionType());
             }
+
         }
-        int detailNumber = 1;
-        PaperDetail singPd = null;
-        PaperDetail multipePd = null;
-        PaperDetail boolPd = null;
-        PaperDetail blankPd = null;
-        PaperDetail textPd = null;
-        PaperDetail nestPd = null;
-        if (singUnits != null && singUnits.size() > 0) {
-            singPd = this.constuctPaperDeatil(singUnits, detailNumber, QuesStructType.SINGLE_ANSWER_QUESTION.getName());
-            detailNumber++;
-        } else if (multipleUnits != null && multipleUnits.size() > 0) {
-            multipePd = this.constuctPaperDeatil(multipleUnits, detailNumber,
-                    QuesStructType.MULTIPLE_ANSWER_QUESTION.getName());
-            detailNumber++;
-        } else if (boolUnits != null && boolUnits.size() > 0) {
-            boolPd = this.constuctPaperDeatil(boolUnits, detailNumber, QuesStructType.BOOL_ANSWER_QUESTION.getName());
-            detailNumber++;
-        } else if (blankUnits != null && blankUnits.size() > 0) {
-            blankPd = this.constuctPaperDeatil(blankUnits, detailNumber, QuesStructType.FILL_BLANK_QUESTION.getName());
-            detailNumber++;
-        } else if (textUnits != null && textUnits.size() > 0) {
-            textPd = this.constuctPaperDeatil(textUnits, detailNumber, QuesStructType.TEXT_ANSWER_QUESTION.getName());
-            detailNumber++;
-        } else if (nestUnits != null && nestUnits.size() > 0) {
-            nestPd = this.constuctPaperDeatil(nestUnits, detailNumber, QuesStructType.NESTED_ANSWER_QUESTION.getName());
+        Map<QuesStructType, List<PaperDetailUnit>> unitMap = new HashMap<QuesStructType, List<PaperDetailUnit>>();
+        Map<QuesStructType, Integer> qTypeIndexMap = new HashMap<QuesStructType, Integer>();
+        for (int i = 1; i <= qsts.size(); i++) {
+            List<PaperDetailUnit> tempUnits = new ArrayList<PaperDetailUnit>();
+            for (int j = 0; j < selectedUnits.size(); j++) {
+                if (qsts.get(i - 1) == selectedUnits.get(j).getQuestionType()) {
+                    tempUnits.add(selectedUnits.get(j));
+                }
+            }
+            unitMap.put(qsts.get(i - 1), tempUnits);
+            qTypeIndexMap.put(qsts.get(i - 1), i);
+
         }
-        selectedUnits.clear();
-        List<PaperDetail> pds = new ArrayList<PaperDetail>();
-        int paperDetailCount = 0;// 大题数量
-        Double totalScore = 0d;
-        if (singPd != null && singPd.getUnitCount() > 0) {
-            paperDetailCount = paperDetailCount + 1;
-            totalScore += singPd.getScore();
-            pds.add(singPd);
-            selectedUnits.addAll(singUnits);
-        } else if (multipePd != null && multipePd.getUnitCount() > 0) {
-            paperDetailCount = paperDetailCount + 1;
-            totalScore += singPd.getScore();
-            pds.add(multipePd);
-            selectedUnits.addAll(multipleUnits);
-        } else if (boolPd != null && boolPd.getUnitCount() > 0) {
-            paperDetailCount = paperDetailCount + 1;
-            totalScore += singPd.getScore();
-            pds.add(boolPd);
-            selectedUnits.addAll(boolUnits);
-        } else if (blankPd != null && blankPd.getUnitCount() > 0) {
-            paperDetailCount = paperDetailCount + 1;
-            totalScore += singPd.getScore();
-            pds.add(blankPd);
-            selectedUnits.addAll(blankUnits);
-        } else if (textPd != null && textPd.getUnitCount() > 0) {
-            paperDetailCount = paperDetailCount + 1;
-            totalScore += singPd.getScore();
-            pds.add(textPd);
-            selectedUnits.addAll(textUnits);
-        } else if (nestPd != null && nestPd.getUnitCount() > 0) {
-            paperDetailCount = nestPd.getUnitCount() + paperDetailCount;
-            totalScore += singPd.getScore();
-            pds.add(nestPd);
-            selectedUnits.addAll(nestUnits);
+        List<PaperDetail> details = new ArrayList<PaperDetail>();
+        for (QuesStructType qType : unitMap.keySet()) {
+            details.add(this.constuctPaperDeatil(unitMap.get(qType), qTypeIndexMap.get(qType), qType.getName()));
         }
-        paper.setName(genPaperDto.getPaperName());
-        paper.setCourseName(genPaperDto.getCourseName());
-        paper.setCourseNo(genPaperDto.getCourseNo());
-        paper.setCreator(genPaperDto.getCreator());
-        paper.setCreateTime(CommonUtils.getCurDateTime());
-        paper.setTotalScore(totalScore);
-        paper.setPaperDetailCount(paperDetailCount);
-        // 数据入库
-        paper = this.persistentPaper(pds, selectedUnits, paper);
+        Paper paper = this.persistentPaper(selectedUnits, details,this.constuctPaperByPaperDetails(details, genPaperDto));
         return paper;
 
     }
@@ -396,18 +328,35 @@ public class GenPaperService {
      * @param paper
      * @return
      */
-    public Paper persistentPaper(List<PaperDetail> details, List<PaperDetailUnit> selectedUnits, Paper paper) {
+    public Paper persistentPaper(List<PaperDetailUnit> selectedUnits, List<PaperDetail> details, Paper paper) {
+        paper = paperRepo.save(paper);
         for (PaperDetail pd : details) {
             pd.setPaper(paper);
         }
+        paperDetailRepo.save(details);
         for (PaperDetailUnit pdu : selectedUnits) {
             pdu.setPaper(paper);
         }
         unitRepo.save(selectedUnits);
-        paperDetailRepo.save(details);
-        paperRepo.save(paper);
         return paper;
 
     }
 
+    /**
+     * 获取所试题数量
+     * 
+     * @param units小题集合
+     * @return
+     */
+    public int getTotalQuesNum(List<PaperDetailUnit> units) {
+        int totalQuesNum = units.size();
+        int nestQuesNum = 0;
+        for (PaperDetailUnit unit : units) {
+            if (unit.getQuestionType() == QuesStructType.NESTED_ANSWER_QUESTION) {
+                nestQuesNum += unit.getQuestion().getSubQuestions().size() - 1;
+            }
+        }
+        return totalQuesNum + nestQuesNum;
+    }
+
 }

+ 13 - 1
cqb-paper/src/main/java/com/qmth/cqb/paper/model/PaperDetailUnit.java

@@ -9,7 +9,7 @@ import com.qmth.cqb.question.model.Question;
 
 import cn.com.qmth.examcloud.common.dto.question.enums.QuesStructType;
 
-public class PaperDetailUnit implements Serializable {
+public class PaperDetailUnit implements Serializable, Comparable<PaperDetailUnit> {
 
     private static final long serialVersionUID = -8854150484922002075L;
 
@@ -109,4 +109,16 @@ public class PaperDetailUnit implements Serializable {
 
     public PaperDetailUnit() {
     }
+
+    @Override
+    public int compareTo(PaperDetailUnit unit) {
+        if (unit != null) {
+            if (this.getQuestionType().getId() > unit.getQuestionType().getId()) {
+                return 1;
+            } else if (this.getQuestionType().getId() == unit.getQuestionType().getId()) {
+                return 0;
+            }
+        }
+        return -1;
+    }
 }

+ 24 - 0
cqb-paper/src/main/java/com/qmth/cqb/paper/service/ExtractService.java

@@ -19,6 +19,7 @@ import com.qmth.cqb.paper.model.ExtractConfig;
 import com.qmth.cqb.paper.model.Paper;
 import com.qmth.cqb.paper.model.PaperDetail;
 import com.qmth.cqb.paper.model.PaperDetailUnit;
+import com.qmth.cqb.question.dao.QuesRepo;
 import com.qmth.cqb.question.model.Question;
 import com.qmth.cqb.utils.BeanCopierUtil;
 import com.qmth.cqb.utils.CommonUtils;
@@ -49,6 +50,9 @@ public class ExtractService {
     @Autowired
     PaperDetailUnitRepo paperDetailUnitRepo;
 
+    @Autowired
+    QuesRepo questionRepo;
+
     /**
      * 随机抽一张试卷
      * 
@@ -114,4 +118,24 @@ public class ExtractService {
         return extractConfigRepo.findOne(Example.of(tempConfig));
     }
 
+    public Map<String, Object> getQuestionById(String id) {
+        String msg = "";
+        Map<String, Object> quesMap = new HashMap<String, Object>();
+        Question ques = questionRepo.findOne(id);
+        QuestionDto dto = BeanCopierUtil.copyProperties(ques, QuestionDto.class);
+        if (ques.getQuestionType() == QuesStructType.NESTED_ANSWER_QUESTION) {// 假如是套题
+            List<Question> subQuesList = ques.getSubQuestions();
+            List<QuestionDto> quesDtos = BeanCopierUtil.copyPropertiesOfList(subQuesList, QuestionDto.class);
+            for (int m = 0; m < subQuesList.size(); m++) {
+                List<QuesOptionDto> quesOptionDtos = BeanCopierUtil
+                        .copyPropertiesOfList(subQuesList.get(m).getQuesOptions(), QuesOptionDto.class);
+                quesDtos.get(m).setQuesOptions(quesOptionDtos);
+                dto.setSubQuestions(quesDtos);
+            }
+        }
+        msg = "success";
+        quesMap.put("quesDto", dto);
+        quesMap.put("msg", msg);
+        return quesMap;
+    }
 }

+ 11 - 0
cqb-paper/src/main/java/com/qmth/cqb/paper/web/ExtractController.java

@@ -49,4 +49,15 @@ public class ExtractController {
         }
     }
 
+    @ApiOperation(value = "抽取单个试题", notes = "抽取单个试题")
+    @GetMapping(value = "/extractQues/{ques_id}")
+    public ResponseEntity extractQuestion(@PathVariable String ques_id) {
+        Map<String, Object> quesMap = new HashMap<String, Object>();
+        quesMap = extractService.getQuestionById(ques_id);
+        if (quesMap.get("msg").equals("success")) {
+            return new ResponseEntity(quesMap.get("quesDto"), HttpStatus.OK);
+        } else {
+            return new ResponseEntity(quesMap.get("msg"), HttpStatus.INTERNAL_SERVER_ERROR);
+        }
+    }
 }