|
@@ -1,18 +1,18 @@
|
|
|
package com.qmth.cqb.paper.service.impl;
|
|
|
|
|
|
|
|
|
-import java.util.ArrayList;
|
|
|
-import java.util.Collections;
|
|
|
-import java.util.HashMap;
|
|
|
-import java.util.Iterator;
|
|
|
-import java.util.List;
|
|
|
-import java.util.Map;
|
|
|
-import java.util.Random;
|
|
|
-import java.util.Set;
|
|
|
+import java.util.*;
|
|
|
import java.util.regex.Matcher;
|
|
|
import java.util.regex.Pattern;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
+import com.qmth.cqb.paper.assemble.PaperDetailDtoAssembler;
|
|
|
+import com.qmth.cqb.paper.assemble.PaperDetailUnitDtoAssembler;
|
|
|
+import com.qmth.cqb.paper.assemble.PaperDtoAssembler;
|
|
|
+import com.qmth.cqb.paper.assemble.SubQuestionDtoAssembler;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
+import org.apache.commons.lang3.SystemUtils;
|
|
|
+import org.bson.types.ObjectId;
|
|
|
import org.nlpcn.commons.lang.util.StringUtil;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
@@ -129,6 +129,18 @@ public class ExtractConfigServiceImpl implements ExtractConfigService {
|
|
|
@Value("${upyun.downloadUrl}")
|
|
|
private String downloadUrl;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private PaperDtoAssembler paperDtoAssembler;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private PaperDetailDtoAssembler paperDetailDtoAssembler;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private PaperDetailUnitDtoAssembler paperDetailUnitDtoAssembler;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private SubQuestionDtoAssembler subQuestionDtoAssembler;
|
|
|
+
|
|
|
|
|
|
@Override
|
|
|
public ExtractConfig findConfig(ExtractConfig condition) {
|
|
@@ -172,37 +184,68 @@ public class ExtractConfigServiceImpl implements ExtractConfigService {
|
|
|
public Map<String, Object> extractExamPaper(Long exam_id,String course_code,String group_code){
|
|
|
Map<String, Object> returnMap = new HashMap<String,Object>();
|
|
|
logger.info("调卷开始...");
|
|
|
+ long beginTime = System.currentTimeMillis();
|
|
|
logger.info("开始根据examId:"+exam_id+"和courseCode:"+course_code+"获取调卷规则");
|
|
|
ExtractConfig extractConfig = this.findConfig(new ExtractConfig(exam_id,course_code));
|
|
|
if(extractConfig==null){
|
|
|
- logger.info("该考试和课程下调卷规则未制定,请先制定调卷规则,调卷程序退出");
|
|
|
+ logger.error("该考试和课程下调卷规则未制定,请先制定调卷规则,调卷程序退出");
|
|
|
returnMap.put("errorMsg","该考试和课程下调卷规则未制定,请先制定调卷规则");
|
|
|
return returnMap;
|
|
|
}
|
|
|
+ long configFinishTime = System.currentTimeMillis();
|
|
|
+ logger.info("获取调卷规则共耗时:"+(configFinishTime - beginTime)+"ms");
|
|
|
logger.info("根据调卷规则中设置的概率获取类型为"+group_code+"的试卷");
|
|
|
Map<String,Paper> paperMap = this.getExamPaperByProbability(extractConfig.getExamPaperList());
|
|
|
if(paperMap.isEmpty()){
|
|
|
- logger.info("该考试和课程下调卷规则中试卷不存在,请检查调卷规则,调卷程序退出");
|
|
|
+ logger.error("该考试和课程下调卷规则中试卷不存在,请检查调卷规则,调卷程序退出");
|
|
|
returnMap.put("errorMsg","该考试和课程下调卷规则中试卷不存在,请重新制定调卷规则");
|
|
|
return returnMap;
|
|
|
}
|
|
|
+
|
|
|
+ long paperMapFinishTime = System.currentTimeMillis();
|
|
|
+ logger.info("获取类型为"+group_code+"的试卷共耗时:"+(paperMapFinishTime - configFinishTime)+"ms");
|
|
|
+
|
|
|
Paper basePaper = paperMap.get(group_code);
|
|
|
if(basePaper==null){
|
|
|
- logger.info("该考试和课程下调卷规则中该类型试卷不存在,请检查调卷规则,调卷程序退出");
|
|
|
+ logger.error("该考试和课程下调卷规则中该类型试卷不存在,请检查调卷规则,调卷程序退出");
|
|
|
returnMap.put("errorMsg","该考试和课程下调卷规则中该类型试卷不存在,请重新制定调卷规则");
|
|
|
return returnMap;
|
|
|
}
|
|
|
String basePaperId = basePaper.getId();
|
|
|
logger.info("将原始试卷:"+basePaperId+"根据规则重新组卷");
|
|
|
- Paper newPaper = this.recombinationPaper(basePaper,PaperType.STUDENT_EXAM,
|
|
|
- extractConfig.getScrambling_the_question_order(),
|
|
|
- extractConfig.getScrambling_the_option_order());
|
|
|
- logger.info("根据新试卷 paperId:"+newPaper.getId()+"组装PaperDto后返回");
|
|
|
- PaperDto paperDto = getPaperDtoByPaper(newPaper);
|
|
|
- paperDto.setBasePaperId(basePaperId);
|
|
|
- paperDto.setAllQbjectiveQuestion(checkIsAllQbjectiveQuestion(basePaperId));
|
|
|
- returnMap.put("paperDto",paperDto);
|
|
|
- logger.info("调卷完成");
|
|
|
+ int upSetQuestionOrder = extractConfig.getScrambling_the_question_order();
|
|
|
+ int upSetOptionOrder = extractConfig.getScrambling_the_option_order();
|
|
|
+ //不乱序直接调卷
|
|
|
+ if(upSetQuestionOrder == 0 && upSetOptionOrder == 0){
|
|
|
+ PaperDto paperDto = getPaperDtoByPaper(basePaper);
|
|
|
+ long paperDtoFinishTime = System.currentTimeMillis();
|
|
|
+ logger.info("获取试卷Dto共耗时:"+(paperDtoFinishTime - paperMapFinishTime)+"ms");
|
|
|
+ paperDto.setBasePaperId(basePaperId);
|
|
|
+ paperDto.setAllQbjectiveQuestion(checkIsAllQbjectiveQuestion(basePaperId));
|
|
|
+ returnMap.put("paperDto",paperDto);
|
|
|
+ logger.info("调卷完成");
|
|
|
+ logger.info("总共耗时:"+(System.currentTimeMillis() - beginTime)+"ms");
|
|
|
+ }else{
|
|
|
+ //乱序重新生成试卷
|
|
|
+ Paper newPaper = this.recombinationPaper(basePaper,PaperType.STUDENT_EXAM,
|
|
|
+ upSetQuestionOrder,
|
|
|
+ upSetOptionOrder);
|
|
|
+ logger.info("根据新试卷 paperId:"+newPaper.getId()+"组装PaperDto后返回");
|
|
|
+
|
|
|
+ long genPaperFinishTime = System.currentTimeMillis();
|
|
|
+ logger.info("组卷共耗时:"+(genPaperFinishTime - paperMapFinishTime)+"ms");
|
|
|
+
|
|
|
+ PaperDto paperDto = getPaperDtoByPaper(newPaper);
|
|
|
+
|
|
|
+ long paperDtoFinishTime = System.currentTimeMillis();
|
|
|
+ logger.info("获取试卷Dto共耗时:"+(paperDtoFinishTime - genPaperFinishTime)+"ms");
|
|
|
+
|
|
|
+ paperDto.setBasePaperId(basePaperId);
|
|
|
+ paperDto.setAllQbjectiveQuestion(checkIsAllQbjectiveQuestion(basePaperId));
|
|
|
+ returnMap.put("paperDto",paperDto);
|
|
|
+ logger.info("调卷完成");
|
|
|
+ logger.info("总共耗时:"+(System.currentTimeMillis() - beginTime)+"ms");
|
|
|
+ }
|
|
|
return returnMap;
|
|
|
}
|
|
|
|
|
@@ -261,20 +304,35 @@ public class ExtractConfigServiceImpl implements ExtractConfigService {
|
|
|
* @return
|
|
|
*/
|
|
|
public Paper recombinationPaper(Paper paper,PaperType paperType,int upSetQuestionOrder,int upSetOptionOrder){
|
|
|
+
|
|
|
+ //将小题全部取出来,只取一次
|
|
|
+ List<PaperDetailUnit> allPaperDetailUnits = paperDetailUnitRepo.findByPaperOrderByNumber(paper);
|
|
|
+ //获取大题
|
|
|
List<PaperDetail> paperDetails = paperDetailRepo.findByPaperOrderByNumber(paper);
|
|
|
+
|
|
|
+ //抽取大题号对应的小题
|
|
|
+ Map<String,List<PaperDetailUnit>> pduMap = allPaperDetailUnits.stream()
|
|
|
+ .collect(Collectors.groupingBy(PaperDetailUnit::getDetailId));
|
|
|
+ //最终保存的所有小题
|
|
|
+ List<PaperDetailUnit> savePaperDetailUnits = new ArrayList<>();
|
|
|
+ //保存试卷信息
|
|
|
paper.setId(null);
|
|
|
paper.setPaperType(paperType);
|
|
|
- Paper newPaper = paperRepo.save(paper);//重新保存成新的paper
|
|
|
+ Paper newPaper = paperRepo.insert(paper);
|
|
|
+
|
|
|
for(int i = 0;i<paperDetails.size();i++){
|
|
|
PaperDetail paperDetail = paperDetails.get(i);
|
|
|
+
|
|
|
+ List<PaperDetailUnit> paperDetailUnits = pduMap.get(paperDetail.getId());
|
|
|
+ if(paperDetailUnits == null || paperDetailUnits.size() == 0){
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ Collections.sort(paperDetailUnits);
|
|
|
+
|
|
|
//将大题中最小的number取出
|
|
|
- PaperDetailUnit topDetailUnit = paperDetailUnitService.findTopOrderByNumber(paperDetail,"ASC");
|
|
|
+ PaperDetailUnit topDetailUnit = paperDetailUnits.get(0);
|
|
|
int minNumber = topDetailUnit.getNumber();
|
|
|
- List<PaperDetailUnit> paperDetailUnits = paperDetailUnitService.getUnitsByPaperDetail(paperDetail);
|
|
|
-
|
|
|
- paperDetail.setPaper(newPaper);//关联新Paper
|
|
|
- paperDetail.setId(null);
|
|
|
- PaperDetail newPaperDetail = paperDetailRepo.save(paperDetail);//保存新的paperDetail
|
|
|
+
|
|
|
//小题乱序
|
|
|
if(paperDetailUnits!=null&&paperDetailUnits.size()>0){
|
|
|
if((topDetailUnit.getQuestionType()==QuesStructType.SINGLE_ANSWER_QUESTION
|
|
@@ -284,17 +342,33 @@ public class ExtractConfigServiceImpl implements ExtractConfigService {
|
|
|
Collections.shuffle(paperDetailUnits);//打乱小题List
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+ //设置大题信息
|
|
|
+ paperDetail.setId(null);
|
|
|
+ paperDetail.setPaper(newPaper);
|
|
|
+
|
|
|
for(int j = 0;j<paperDetailUnits.size();j++){
|
|
|
//重新设置保存PaperDetailUnit
|
|
|
PaperDetailUnit paperDetailUnit = paperDetailUnits.get(j);
|
|
|
- paperDetailUnit.setPaperType(newPaper.getPaperType());
|
|
|
- paperDetailUnit.setPaper(newPaper); //关联新Paper
|
|
|
- paperDetailUnit.setPaperDetail(newPaperDetail); //关联新paperDetail
|
|
|
+ paperDetailUnit.setPaperType(paperType);
|
|
|
+ paperDetailUnit.setPaper(newPaper);
|
|
|
+ paperDetailUnit.setPaperDetail(paperDetail);
|
|
|
paperDetailUnit.setNumber(minNumber+j); //重新设置序号
|
|
|
reSavePaperDetailUtilAndQuestion(paperDetailUnit,upSetOptionOrder);
|
|
|
+ savePaperDetailUnits.add(paperDetailUnit);
|
|
|
}
|
|
|
+
|
|
|
}
|
|
|
+ //保存大题信息
|
|
|
+ paperDetailRepo.insert(paperDetails);
|
|
|
+ //保存小题信息
|
|
|
+ paperDetailUnitRepo.insert(savePaperDetailUnits);
|
|
|
+
|
|
|
+
|
|
|
+ //清空所有list
|
|
|
+ allPaperDetailUnits.clear();
|
|
|
+ savePaperDetailUnits.clear();
|
|
|
+ paperDetails.clear();
|
|
|
+
|
|
|
return newPaper;
|
|
|
}
|
|
|
|
|
@@ -408,7 +482,6 @@ public class ExtractConfigServiceImpl implements ExtractConfigService {
|
|
|
}
|
|
|
}
|
|
|
paperDetailUnit.setId(null);
|
|
|
- paperDetailUnitRepo.save(paperDetailUnit);//保存新的paperDetailUnit
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -437,18 +510,28 @@ public class ExtractConfigServiceImpl implements ExtractConfigService {
|
|
|
* @return
|
|
|
*/
|
|
|
private PaperDto getPaperDtoByPaper(Paper paper){
|
|
|
- PaperDto paperDto = BeanCopierUtil.copyProperties(paper, PaperDto.class);
|
|
|
- // 获取大题
|
|
|
- List<PaperDetail> paperDetails = paperDetailRepo.findByPaperOrderByNumber(paper);
|
|
|
- List<PaperDetailDto> paperDetailDtos = BeanCopierUtil.copyPropertiesOfList(paperDetails, PaperDetailDto.class);
|
|
|
+ PaperDto paperDto = paperDtoAssembler.toDto(paper);
|
|
|
+
|
|
|
+ //将小题全部取出来,只取一次
|
|
|
+ List<PaperDetailUnit> allPaperDetailUnits = paperDetailUnitRepo.findByPaperOrderByNumber(paper);
|
|
|
+ //获取大题
|
|
|
+ List<PaperDetail> paperDetails = paperDetailRepo.findByPaperOrderByNumber(paper);
|
|
|
+ //抽取大题Id对应的小题
|
|
|
+ Map<String,List<PaperDetailUnit>> pduMap = allPaperDetailUnits.stream()
|
|
|
+ .collect(Collectors.groupingBy(PaperDetailUnit::getDetailId));
|
|
|
+ // 获取大题Dto
|
|
|
+ List<PaperDetailDto> paperDetailDtos = paperDetailDtoAssembler.toDtoList(paperDetails);
|
|
|
paperDto.setPaperDetails(paperDetailDtos);
|
|
|
+
|
|
|
// 封装小题
|
|
|
for (int i = 0; i < paperDetailDtos.size(); i++) {
|
|
|
//根据大题查出大题下面的小题
|
|
|
- List<PaperDetailUnit> paperDetailUnits = paperDetailUnitRepo.findByPaperDetailOrderByNumber(paperDetails.get(i));
|
|
|
+ PaperDetail paperDetail = paperDetails.get(i);
|
|
|
+
|
|
|
+ List<PaperDetailUnit> paperDetailUnits = pduMap.get(paperDetail.getId());
|
|
|
//设置答案
|
|
|
setSelectQuestoionAnswer(paperDetailUnits);
|
|
|
- List<PaperDetailUnitDto> paperDetailUnitDtos = BeanCopierUtil.copyPropertiesOfList(paperDetailUnits,PaperDetailUnitDto.class);
|
|
|
+ List<PaperDetailUnitDto> paperDetailUnitDtos = paperDetailUnitDtoAssembler.toDtoList(paperDetailUnits);
|
|
|
for (int j = 0; j < paperDetailUnitDtos.size(); j++) {
|
|
|
PaperDetailUnit paperDetailUnit = paperDetailUnits.get(j);
|
|
|
if(paperDetailUnit==null||paperDetailUnit.getQuestion()==null){
|
|
@@ -467,9 +550,9 @@ public class ExtractConfigServiceImpl implements ExtractConfigService {
|
|
|
}
|
|
|
if (unitDto.getQuestionType() == QuesStructType.NESTED_ANSWER_QUESTION) {// 假如是套题
|
|
|
List<Question> subQuesList = paperDetailUnit.getQuestion().getSubQuestions();
|
|
|
- List<SubQuestionDto> subQuesDtos = BeanCopierUtil.copyPropertiesOfList(subQuesList,SubQuestionDto.class);
|
|
|
+ List<SubQuestionDto> subQuesDtos = subQuestionDtoAssembler.toDtoList(subQuesList);
|
|
|
for (int m = 0; m < subQuesList.size(); m++) {
|
|
|
- List<QuesOptionDto> quesOptionDtos = BeanCopierUtil.copyPropertiesOfList(subQuesList.get(m).getQuesOptions(), QuesOptionDto.class);
|
|
|
+ List<QuesOptionDto> quesOptionDtos = subQuestionDtoAssembler.toOptionDtoList(subQuesList.get(m).getQuesOptions());
|
|
|
subQuesDtos.get(m).setQuesOptions(quesOptionDtos);
|
|
|
if(StringUtils.isNotEmpty(subQuesList.get(m).getQuesAnswer())){
|
|
|
subQuesDtos.get(m).setQuesAnswer(subQuesList.get(m).getQuesAnswer());
|