|
@@ -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;
|
|
|
+ }
|
|
|
+
|
|
|
}
|