|
|
@@ -56,7 +56,7 @@ public class PaperService {
|
|
|
// buildAllPapers(2);
|
|
|
// buildSimulatedPaper(20154L, 1001L);
|
|
|
// buildSimulatedPaper(20950L, 1001L);
|
|
|
- // buildSimulatedPaperForUniversity(20972L, 11L, 215L, 2);
|
|
|
+ // buildSimulatedPaperForUniversity(20950L, 11L, 78L, 2);
|
|
|
// test2();
|
|
|
// testCulture();
|
|
|
}
|
|
|
@@ -389,13 +389,72 @@ public class PaperService {
|
|
|
}
|
|
|
newKnownList.addAll(tailKnownList);
|
|
|
ktd.setKnowledges(newKnownList);
|
|
|
- Map<String, KnowTypeAssign> knowTypeAssignMap = buildKnowTypeAssignMap(studentId, ktd.getTypes().stream().map(t -> t.getType().getTitle()).collect(Collectors.toList()), newKnownList, paperDef.getFillExclude());
|
|
|
+ Map<String, KnowTypeAssign> knowTypeAssignMap = buildKnowTypeAssignMap(studentId, "0", ktd.getTypes().stream().map(t -> t.getType().getTitle()).collect(Collectors.toList()), newKnownList, paperDef.getFillExclude());
|
|
|
assignTypeFirst(paperDef.getFillExclude(), ktd, knowTypeAssignMap);
|
|
|
pqList.addAll(getQuestions2(studentId, ktd.getCount(), pqList.size(), newKnownList, ktd.getTypes(), knowTypeAssignMap, existQuestionIdSet));
|
|
|
}
|
|
|
return pqList;
|
|
|
}
|
|
|
|
|
|
+ public List<LearnPaperQuestion> getQuestionsByRandom(Long studentId, Integer total, Long knowledgeId, List<String> types) {
|
|
|
+ Map<String, KnowTypeAssign> knowTypeAssignMap = buildKnowTypeAssignMap(studentId, "1", types, Lists.newArrayList(knowledgeId), false);
|
|
|
+ List<KnowTypeAssign> knowTypeAssignList = Lists.newArrayList(knowTypeAssignMap.values());
|
|
|
+ List<LearnPaperQuestion> pqList = Lists.newArrayList();
|
|
|
+ Set<Long> existQuestionIdSet = Sets.newHashSet();
|
|
|
+ Random random = new Random();
|
|
|
+ Map<String, List<LearnQuestions>> typeQuestionMap = Maps.newHashMap();
|
|
|
+ LearnQuestions qCond = new LearnQuestions();
|
|
|
+ do {
|
|
|
+ if(knowTypeAssignList.isEmpty()) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ int idx = random.nextInt(knowTypeAssignList.size());
|
|
|
+ KnowTypeAssign knowTypeAssign = knowTypeAssignList.get(idx);
|
|
|
+ if(knowTypeAssign.getExclCount() > knowTypeAssign.getExclAssign()) {
|
|
|
+ List<LearnQuestions> questions = typeQuestionMap.get(knowTypeAssign.getType());
|
|
|
+ if(null == questions) {
|
|
|
+ qCond.setKnowledgeId(knowledgeId);
|
|
|
+ qCond.setQtpye(knowTypeAssign.getType());
|
|
|
+ qCond.setId(studentId);
|
|
|
+ qCond.setNumber(knowTypeAssign.exclAssign > 500 ? (long) random.nextInt(knowTypeAssign.exclAssign.intValue() - 500) : 0L);
|
|
|
+ qCond.setIsSubType("1");
|
|
|
+ questions = questionsMapper.selectQuestionsForPaper(qCond);
|
|
|
+ typeQuestionMap.put(knowTypeAssign.getType(), questions);
|
|
|
+ }
|
|
|
+ if(!questions.isEmpty()) {
|
|
|
+ int oldSize = pqList.size();
|
|
|
+ knowTypeAssign.exclAssign = addRandomList(knowledgeId, knowTypeAssign.getType(), questions, random, total.longValue(), 1L, 1.0, existQuestionIdSet, 1, pqList);
|
|
|
+ if(oldSize != pqList.size()) {
|
|
|
+ for(; oldSize < pqList.size(); oldSize++) {
|
|
|
+ pqList.get(oldSize).setSeq(QuestionType.of(knowTypeAssign.getType()).getVal());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ knowTypeAssignList.remove(idx);
|
|
|
+ }
|
|
|
+ } while(pqList.size() < total);
|
|
|
+ Collections.sort(pqList, new Comparator<LearnPaperQuestion>() {
|
|
|
+ @Override
|
|
|
+ public int compare(LearnPaperQuestion o1, LearnPaperQuestion o2) {
|
|
|
+ int iRet;
|
|
|
+ if(0 != (iRet = o1.getSeq().compareTo(o2.getSeq()))) {
|
|
|
+ return iRet;
|
|
|
+ }
|
|
|
+ if(0 != (iRet = o1.getPaperId().compareTo(o2.getPaperId()))) {
|
|
|
+ return iRet;
|
|
|
+ }
|
|
|
+ return o1.getQuestionId().compareTo(o2.getQuestionId());
|
|
|
+ }
|
|
|
+ });
|
|
|
+ Integer[] idx = {1};
|
|
|
+ pqList.forEach(t -> {
|
|
|
+ t.setSeq(idx[0]++);
|
|
|
+ t.setPaperId(null);
|
|
|
+ });
|
|
|
+ return pqList;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 按知识点,题型平均分配组卷
|
|
|
* @param studentId
|
|
|
@@ -691,6 +750,7 @@ public class PaperService {
|
|
|
}
|
|
|
qCond.setKnowledgeId(ktc.getKnowId());
|
|
|
qCond.setQtpye(ktc.getType());
|
|
|
+ qCond.setIsSubType("0");
|
|
|
if(ktc.exclAssign > 0){
|
|
|
qCond.setId(studentId);
|
|
|
qCond.setNumber(ktc.exclAssign > 500 ? (long) random.nextInt(ktc.exclAssign.intValue() - 500) : 0L);
|
|
|
@@ -735,6 +795,7 @@ public class PaperService {
|
|
|
}
|
|
|
qCond.setKnowledgeId(ktc.getKnowId());
|
|
|
qCond.setQtpye(typeTitle);
|
|
|
+ qCond.setIsSubType("0");
|
|
|
if(ktc.exclAssign > 0){
|
|
|
qCond.setId(studentId);
|
|
|
qCond.setNumber(ktc.exclAssign > 500 ? (long) random.nextInt(ktc.exclAssign.intValue() - 500) : 0L);
|
|
|
@@ -772,7 +833,7 @@ public class PaperService {
|
|
|
* @return
|
|
|
*/
|
|
|
private Map<String, KnowTypeAssign> buildKnowTypeAssignMap(Long studentId, TestPaperVO.PaperDef paperDef) {
|
|
|
- return buildKnowTypeAssignMap(studentId, paperDef.getTypes().stream().map(TestPaperVO.TypeDef::getType).collect(Collectors.toList()), paperDef.getKnowIds(), paperDef.getFillExclude());
|
|
|
+ return buildKnowTypeAssignMap(studentId, "0", paperDef.getTypes().stream().map(TestPaperVO.TypeDef::getType).collect(Collectors.toList()), paperDef.getKnowIds(), paperDef.getFillExclude());
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -783,12 +844,13 @@ public class PaperService {
|
|
|
* @param fillExclude
|
|
|
* @return
|
|
|
*/
|
|
|
- private Map<String, KnowTypeAssign> buildKnowTypeAssignMap(Long studentId, List<String> types, Collection<Long> knownIds, Boolean fillExclude) {
|
|
|
+ private Map<String, KnowTypeAssign> buildKnowTypeAssignMap(Long studentId, String isSubType, List<String> types, Collection<Long> knownIds, Boolean fillExclude) {
|
|
|
Map<String, KnowTypeAssign> knowTypeAssignMap = Maps.newHashMap();
|
|
|
Map cond = Maps.newHashMap();
|
|
|
cond.put("studentId", studentId);
|
|
|
cond.put("knowIds", knownIds);
|
|
|
cond.put("types", types);
|
|
|
+ cond.put("isSubType", isSubType);
|
|
|
setValue(knowTypeAssignMap, cond, 1); // 填充排除后总量
|
|
|
if (null != studentId && fillExclude) {
|
|
|
cond.remove("studentId");
|
|
|
@@ -813,15 +875,32 @@ public class PaperService {
|
|
|
while(count > 0L && !questions.isEmpty()) {
|
|
|
LearnQuestions q = questions.size() > 1 ? questions.remove(random.nextInt(questions.size() - 1)) : questions.remove(0);
|
|
|
if(existQuestionIdSet.add(q.getId())) {
|
|
|
- LearnPaperQuestion pq = new LearnPaperQuestion();
|
|
|
- pq.setSeq(baseSeq + pqList.size());
|
|
|
- pq.setKnowledgeId(knowId);
|
|
|
- pq.setScore(score);
|
|
|
- pq.setQuestionId(q.getId());
|
|
|
- pq.setType(type);
|
|
|
- pqList.add(pq);
|
|
|
- count--;
|
|
|
- if(pqList.size() == totalCount) {
|
|
|
+ if("1".equals(q.getIsSubType())) {
|
|
|
+ LearnQuestions subCond = new LearnQuestions();
|
|
|
+ subCond.setKnowId(q.getId());
|
|
|
+ for(LearnQuestions sq : questionsMapper.selectLearnQuestionsList(subCond)) {
|
|
|
+ LearnPaperQuestion pq = new LearnPaperQuestion();
|
|
|
+ pq.setSeq(baseSeq + pqList.size());
|
|
|
+ pq.setKnowledgeId(knowId);
|
|
|
+ pq.setScore(score);
|
|
|
+ pq.setQuestionId(sq.getId());
|
|
|
+ pq.setType(type);
|
|
|
+ pq.setPaperId(q.getId());
|
|
|
+ pqList.add(pq);
|
|
|
+ count--;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ LearnPaperQuestion pq = new LearnPaperQuestion();
|
|
|
+ pq.setSeq(baseSeq + pqList.size());
|
|
|
+ pq.setKnowledgeId(knowId);
|
|
|
+ pq.setScore(score);
|
|
|
+ pq.setQuestionId(q.getId());
|
|
|
+ pq.setType(type);
|
|
|
+ pq.setPaperId(0L);
|
|
|
+ pqList.add(pq);
|
|
|
+ count--;
|
|
|
+ }
|
|
|
+ if(pqList.size() >= totalCount) {
|
|
|
break;
|
|
|
}
|
|
|
}
|