소스 검색

优化调卷性能

宋悦 7 년 전
부모
커밋
3898aab731

+ 8 - 0
cqb-paper/src/main/java/com/qmth/cqb/paper/model/PaperDetailUnit.java

@@ -264,4 +264,12 @@ public class PaperDetailUnit implements Serializable, Comparable<PaperDetailUnit
         }
         return CommonUtils.formatDouble(totalScore);
     }
+
+    public int getDetailNumber(){
+        return this.paperDetail.getNumber();
+    }
+
+    public String getDetailId(){
+        return this.paperDetail.getId();
+    }
 }

+ 55 - 23
cqb-paper/src/main/java/com/qmth/cqb/paper/service/impl/ExtractConfigServiceImpl.java

@@ -1,16 +1,10 @@
 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 org.apache.commons.lang3.StringUtils;
 import org.nlpcn.commons.lang.util.StringUtil;
@@ -261,20 +255,36 @@ public class ExtractConfigServiceImpl implements ExtractConfigService {
 	 * @return
 	 */
 	public Paper recombinationPaper(Paper paper,PaperType paperType,int upSetQuestionOrder,int upSetOptionOrder){
-		List<PaperDetail> paperDetails = paperDetailRepo.findByPaperOrderByNumber(paper);
+
+		//将小题全部取出来,只取一次
+		List<PaperDetailUnit> allPaperDetailUnits = paperDetailUnitRepo.findByPaperOrderByNumber(paper);
+		//从小题中抽取大题
+		List<PaperDetail> paperDetails = allPaperDetailUnits.stream()
+				.map(PaperDetailUnit::getPaperDetail)
+				.collect(Collectors.toList());
+		//抽取大题号对应的小题
+		Map<Integer,List<PaperDetailUnit>> pduMap = allPaperDetailUnits.stream()
+				.collect(Collectors.groupingBy(PaperDetailUnit::getDetailNumber));
+		//最终保存的所有小题
+		List<PaperDetailUnit> savePaperDetailUnits = new ArrayList<>();
 		paper.setId(null);
 		paper.setPaperType(paperType);
-		Paper newPaper = paperRepo.save(paper);//重新保存成新的paper
+
 		for(int i = 0;i<paperDetails.size();i++){
 			PaperDetail paperDetail = paperDetails.get(i);
+			paperDetail.setId(null);
+			paperDetail.setPaper(paper);
+
+			List<PaperDetailUnit> paperDetailUnits = pduMap.get(paperDetail.getNumber());
+			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
@@ -288,13 +298,24 @@ public class ExtractConfigServiceImpl implements ExtractConfigService {
 			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(paper);
+				paperDetailUnit.setPaperDetail(paperDetail);
 				paperDetailUnit.setNumber(minNumber+j);			//重新设置序号
 				reSavePaperDetailUtilAndQuestion(paperDetailUnit,upSetOptionOrder);
+				savePaperDetailUnits.add(paperDetailUnit);
 			}
 		}
+		//保存试卷信息
+		Paper newPaper = paperRepo.save(paper);
+		paperDetailRepo.save(paperDetails);
+		paperDetailUnitRepo.save(savePaperDetailUnits);
+
+		//清空所有list
+		allPaperDetailUnits.clear();
+		savePaperDetailUnits.clear();
+		paperDetails.clear();
+
 		return newPaper;
 	}
 	
@@ -408,7 +429,6 @@ public class ExtractConfigServiceImpl implements ExtractConfigService {
 			}
 		}
 		paperDetailUnit.setId(null);
-		paperDetailUnitRepo.save(paperDetailUnit);//保存新的paperDetailUnit
 	}
 
 	@Override
@@ -438,14 +458,26 @@ public class ExtractConfigServiceImpl implements ExtractConfigService {
 	 */
 	private PaperDto getPaperDtoByPaper(Paper paper){
 		PaperDto paperDto = BeanCopierUtil.copyProperties(paper, PaperDto.class);
-        // 获取大题
-        List<PaperDetail> paperDetails = paperDetailRepo.findByPaperOrderByNumber(paper);
+
+		//将小题全部取出来,只取一次
+		List<PaperDetailUnit> allPaperDetailUnits = paperDetailUnitRepo.findByPaperOrderByNumber(paper);
+		//从小题中抽取大题
+		List<PaperDetail> paperDetails = allPaperDetailUnits.stream()
+				.map(PaperDetailUnit::getPaperDetail)
+				.collect(Collectors.toList());
+		//抽取大题Id对应的小题
+		Map<String,List<PaperDetailUnit>> pduMap = allPaperDetailUnits.stream()
+				.collect(Collectors.groupingBy(PaperDetailUnit::getDetailId));
+        // 获取大题Dto
         List<PaperDetailDto> paperDetailDtos = BeanCopierUtil.copyPropertiesOfList(paperDetails, PaperDetailDto.class);
         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);