Переглянути джерело

Merge branch 'dev1130' of https://git.oschina.net/songyue123456/comm-ques-bank into dev1130

chenken 7 роки тому
батько
коміт
89a6802e81

+ 5 - 0
cqb-paper/pom.xml

@@ -33,5 +33,10 @@
             <artifactId>cqb-flow-core</artifactId>
             <version>${project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.mongodb</groupId>
+            <artifactId>mongodb-driver</artifactId>
+            <version>3.4.2</version>
+        </dependency>
     </dependencies>
 </project>

+ 2 - 0
cqb-paper/src/main/java/com/qmth/cqb/paper/dao/PaperDetailUnitRepo.java

@@ -16,6 +16,8 @@ public interface PaperDetailUnitRepo extends MongoRepository<PaperDetailUnit, St
     List<PaperDetailUnit> findByPaperDetailOrderByNumber(PaperDetail paperDetail);
     List<PaperDetailUnit> findByPaperOrderByNumber(Paper paper);
     List<PaperDetailUnit> findByPaper(Paper paper);
+    List<PaperDetailUnit> findByPaperId(String paperId);
+    List<PaperDetailUnit> findByPaperIdOrderByNumber(String paperId);
     List<PaperDetailUnit> findByQuestion(Question question);
     List<PaperDetailUnit> findByQuestionIn(List<Question> questionList);
     PaperDetailUnit findById(String id);

+ 164 - 0
cqb-paper/src/main/java/com/qmth/cqb/paper/dao/nativedriver/PaperDetailUnitNativeRepo.java

@@ -0,0 +1,164 @@
+package com.qmth.cqb.paper.dao.nativedriver;
+
+import cn.com.qmth.examcloud.common.dto.question.enums.QuesStructType;
+import com.mongodb.DBRef;
+import com.mongodb.client.FindIterable;
+import com.mongodb.client.MongoCollection;
+import com.mongodb.client.MongoCursor;
+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.model.Question;
+import com.qmth.cqb.utils.enums.PaperType;
+import org.bson.Document;
+import org.bson.types.ObjectId;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.stereotype.Repository;
+
+import java.util.*;
+
+import static com.mongodb.client.model.Filters.eq;
+
+/**
+ * Created by songyue on 18/1/22.
+ */
+@Repository
+public class PaperDetailUnitNativeRepo{
+
+    private static final Logger log = LoggerFactory.getLogger(PaperDetailUnitNativeRepo.class);
+
+    @Autowired
+    @Qualifier("pduCollection")
+    private MongoCollection<Document> mongoCollection;
+
+    @Autowired
+    private MongoTemplate mongoTemplate;
+
+    public List<PaperDetailUnit> findByPaperId(String paperId){
+
+        long beginTime = System.currentTimeMillis();
+
+        //初始化试卷缓存
+        Paper paperCache = mongoTemplate.findById(getObjectId(paperId),Paper.class);
+
+        //初始化大题缓存
+        Map<String,PaperDetail> pdCache = new HashMap<>();
+
+        //初始化小题列表
+        List<PaperDetailUnit> paperDetailUnits = new ArrayList<>();
+
+        //获取小题原始文档
+        MongoCursor<Document> mongoCursor = mongoCollection.find(eq("paper.$id", getObjectId(paperId))).iterator();
+        long documentEndTime = System.currentTimeMillis();
+        log.info("获取document共耗时:"+(documentEndTime - beginTime)+"ms");
+
+        //转换小题文档
+        while(mongoCursor.hasNext()){
+            Document document = mongoCursor.next();
+            PaperDetailUnit pdu = toDomain(document,paperCache,pdCache);
+            paperDetailUnits.add(pdu);
+        }
+        long pduEndTime = System.currentTimeMillis();
+        log.info("转换document共耗时:"+(pduEndTime - documentEndTime)+"ms");
+        return paperDetailUnits;
+    }
+
+    private PaperDetailUnit toDomain(Document document,
+                                     Paper paperCache,
+                                     Map<String,PaperDetail> pdCache){
+        PaperDetailUnit paperDetailUnit = new PaperDetailUnit();
+        Set<String> pduProperty = document.keySet();
+        for(String key:pduProperty){
+            if(key.equals("_id")){
+
+                paperDetailUnit.setId(String.valueOf(document.get(key)));
+
+            }else if(key.equals("number")){
+
+                paperDetailUnit.setNumber(document.getInteger(key));
+
+            }else if(key.equals("score")){
+
+                paperDetailUnit.setScore(document.getDouble(key));
+
+            }else if(key.equals("subScoreList")){
+
+                List<Double> subScoreList = document.get(key,List.class);
+                paperDetailUnit.setSubScoreList(subScoreList);
+
+            }else if(key.equals("questionType")){
+
+                String quesType = document.getString(key);
+                paperDetailUnit.setQuestionType(QuesStructType.valueOf(quesType));
+
+            }else if(key.equals("optionOrder")){
+
+                paperDetailUnit.setOptionOrder(document.getString(key));
+
+            }else if(key.equals("creator")){
+
+                paperDetailUnit.setCreator(document.getString(key));
+
+            }else if(key.equals("createTime")){
+
+                paperDetailUnit.setCreateTime(document.getString(key));
+
+            }else if(key.equals("paperType")){
+
+                String paperType = document.getString(key);
+                paperDetailUnit.setPaperType(PaperType.valueOf(paperType));
+
+            }else if(key.equals("paper")){
+
+                paperDetailUnit.setPaper(paperCache);
+
+            }else if(key.equals("paperDetail")){
+
+                paperDetailUnit.setPaperDetail(getPaperDetail(document,pdCache));
+
+            }else if(key.equals("question")){
+
+                paperDetailUnit.setQuestion(getQuestion(document));
+
+            }
+        }
+        return paperDetailUnit;
+    }
+
+    private Object getObjectId(String id){
+        if(id == null){
+            return null;
+        }
+        return ObjectId.isValid(id) ? new ObjectId(id) : id;
+    }
+
+    private PaperDetail getPaperDetail(Document parentDocument,Map<String,PaperDetail> pdCache){
+        Object value = parentDocument.get("paperDetail");
+        if(value == null || !(value instanceof DBRef)){
+            return null;
+        }
+        DBRef paperDetailDoc = (DBRef) value;
+        String paperDetailId = String.valueOf(paperDetailDoc.getId());
+        PaperDetail paperDetail = pdCache.get(paperDetailId);
+        if(paperDetail == null){
+            paperDetail = mongoTemplate.findById(getObjectId(paperDetailId),PaperDetail.class);
+            pdCache.put(paperDetailId,paperDetail);
+        }
+        return paperDetail;
+    }
+
+    private Question getQuestion(Document parentDocument){
+        Object value = parentDocument.get("question");
+        if(value == null || !(value instanceof DBRef)){
+            return null;
+        }
+        DBRef quesDoc = (DBRef) value;
+        String quesId = String.valueOf(quesDoc.getId());
+        Question question = mongoTemplate.findById(getObjectId(quesId),Question.class);
+        return question;
+    }
+}

+ 4 - 6
cqb-paper/src/main/java/com/qmth/cqb/paper/service/ExtractConfigService.java

@@ -4,12 +4,7 @@ import java.util.List;
 import java.util.Map;
 
 
-
-
-
-
-
-
+import cn.com.qmth.examcloud.common.dto.question.PaperDto;
 import org.springframework.data.domain.Page;
 
 import cn.com.qmth.examcloud.common.dto.question.QuestionDto;
@@ -104,5 +99,8 @@ public interface ExtractConfigService {
 	 * @return PaperDto
 	 */
 	public Map<String, Object> extractPaper(String paperId);
+
+
+	public PaperDto getPaperDtoByPaperNew(String basePaperId);
 	
 }

+ 19 - 26
cqb-paper/src/main/java/com/qmth/cqb/paper/service/ImportPaperService.java

@@ -1499,24 +1499,26 @@ public class ImportPaperService {
     			paperDetail = paperDetailRepo.save(paperDetail);
     			//查询大题下面所有小题
     			List<PaperDetailUnit> oldPaperDetailUnits = paperDetailUnitRepo.findByPaperDetailOrderByNumber(oldPaperDetail);
-    			for(PaperDetailUnit oldPaperDetailUnit:oldPaperDetailUnits){
-    				PaperDetailUnit paperDetailUnit = new PaperDetailUnit();
-    				paperDetailUnit.setPaper(newPaper);
-    				paperDetailUnit.setNumber(oldPaperDetailUnit.getNumber());
-    				paperDetailUnit.setScore(oldPaperDetailUnit.getScore());
-    				paperDetailUnit.setSubScoreList(oldPaperDetailUnit.getSubScoreList());
-    				paperDetailUnit.setPaperDetail(paperDetail);
-    				paperDetailUnit.setQuestionType(oldPaperDetailUnit.getQuestionType());
-    				copyQuestion(paperDetailUnit,oldPaperDetailUnit);
-    				//paperDetailUnit.setQuestion(oldPaperDetailUnit.getQuestion());
-    				paperDetailUnit.setOptionOrder(oldPaperDetailUnit.getOptionOrder());
-    				paperDetailUnit.setCreator(user.getName());
-    				paperDetailUnit.setCreateTime(CommonUtils.getCurDateTime());
-    				paperDetailUnit.setPaperType(oldPaperDetailUnit.getPaperType());
-    				paperDetailUnitRepo.save(paperDetailUnit);
+    			if(oldPaperDetailUnits !=null && oldPaperDetailUnits.size()>0){
+    				for(PaperDetailUnit oldPaperDetailUnit:oldPaperDetailUnits){
+        				PaperDetailUnit paperDetailUnit = new PaperDetailUnit();
+        				paperDetailUnit.setPaper(newPaper);
+        				paperDetailUnit.setNumber(oldPaperDetailUnit.getNumber());
+        				paperDetailUnit.setScore(oldPaperDetailUnit.getScore());
+        				paperDetailUnit.setSubScoreList(oldPaperDetailUnit.getSubScoreList());
+        				paperDetailUnit.setPaperDetail(paperDetail);
+        				paperDetailUnit.setQuestionType(oldPaperDetailUnit.getQuestionType());
+        				copyQuestion(paperDetailUnit,oldPaperDetailUnit);
+        				//paperDetailUnit.setQuestion(oldPaperDetailUnit.getQuestion());
+        				paperDetailUnit.setOptionOrder(oldPaperDetailUnit.getOptionOrder());
+        				paperDetailUnit.setCreator(user.getName());
+        				paperDetailUnit.setCreateTime(CommonUtils.getCurDateTime());
+        				paperDetailUnit.setPaperType(oldPaperDetailUnit.getPaperType());
+        				paperDetailUnitRepo.save(paperDetailUnit);
+        			}
+    				quesTypeNameService.saveCloneQuesTypeName(oldPaperDetailUnits,newPaper.getCourseNo());
     			}
     		}
-    		
     	}
 	}
 
@@ -1544,19 +1546,10 @@ public class ImportPaperService {
     	newPaper.setLastModifyName(user.getName());
     	newPaper.setOrgId(user.getRootOrgId().toString());
     	newPaper.setCourse(course);
+    	newPaper.setCourseNo(course.getCode());
     	newPaper.setId(null);
 		return paperRepo.save(newPaper);
 	}
-
-	public static void main(String[] args){
-		String s1 = null;
-		String s2 = " ";
-		boolean b = false;
-		if(s2 == null){
-			b = true;
-		}
-		System.out.println(b);
-    }
 	
 	public static boolean isInteger(String str) { 
 		Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$");  

+ 38 - 0
cqb-paper/src/main/java/com/qmth/cqb/paper/service/QuesTypeNameService.java

@@ -58,4 +58,42 @@ public class QuesTypeNameService {
             }
         }
     }
+    
+    /**
+     * 复制试卷时保存来源大题名称
+     * @param detailUnitList
+     */
+    public void saveCloneQuesTypeName(List<PaperDetailUnit> detailUnitList,String courseNo){
+        for(PaperDetailUnit paperDetailUnit:detailUnitList){
+            String orgId = paperDetailUnit.getPaper().getOrgId();
+            QuesStructType questionType = paperDetailUnit.getQuestionType();
+            String detailName = paperDetailUnit.getPaperDetail().getName();
+            List<QuesTypeName> quesTypeNames = quesTypeRepo.findQuesName(orgId,courseNo,questionType);
+            if(quesTypeNames != null && quesTypeNames.size() > 0){
+                QuesTypeName quesTypeName = quesTypeNames.get(0);
+                List<String> quesNames = quesTypeName.getQuesNames();
+                if(quesNames != null && quesNames.size() > 0 ){
+                    if(quesNames.contains(detailName)){
+                        continue;
+                    }else{
+                        quesNames.add(detailName);
+                    }
+                }else{
+                    quesNames = new ArrayList<>();
+                    quesNames.add(detailName);
+                }
+                quesTypeName.setQuesNames(quesNames);
+                quesTypeRepo.save(quesTypeName);
+            }else{
+                QuesTypeName quesTypeName = new QuesTypeName();
+                List<String> quesNames = new ArrayList<>();
+                quesNames.add(detailName);
+                quesTypeName.setOrgId(orgId);
+                quesTypeName.setCourseNo(courseNo);
+                quesTypeName.setQuestionType(questionType);
+                quesTypeName.setQuesNames(quesNames);
+                quesTypeRepo.save(quesTypeName);
+            }
+        }
+    }
 }

+ 2 - 2
cqb-paper/src/main/java/com/qmth/cqb/paper/service/impl/ExportPaperServiceImpl.java

@@ -115,7 +115,7 @@ public class ExportPaperServiceImpl implements ExportPaperService{
 		}
 		makeComputerTestPaperToJsonFile(paper.getCourse().getCode(),computerTestPaper,jsonDirectory);
 		//将文件夹打包成zip压缩包放在docxExport下
-		FileDisposeUtil.fileToZip(jsonDirectory,TEMP_FILE_EXP+File.separator+zipFileName,"computerTestPaper");
+		FileDisposeUtil.fileToZip(jsonDirectory,TEMP_FILE_EXP+File.separator+zipFileName,paper.getCourse().getCode()+"_"+paper.getName());
 	}
 	
 	 /**
@@ -302,7 +302,7 @@ public class ExportPaperServiceImpl implements ExportPaperService{
      */
     private void makeComputerTestPaperToJsonFile(String courseCode,ComputerTestPaper computerTestPaper,String jsonDirectoryPath){
 		//创建新的JSON文件
-		File file = new File(jsonDirectoryPath + File.separator+courseCode+"_" +".json");
+		File file = new File(jsonDirectoryPath + File.separator+courseCode+".json");
 		//将对象转成 json对象
 		Gson gson = new Gson();
 		String strJSON = gson.toJson(computerTestPaper);

+ 127 - 0
cqb-paper/src/main/java/com/qmth/cqb/paper/service/impl/ExtractConfigServiceImpl.java

@@ -11,6 +11,7 @@ import com.qmth.cqb.paper.assemble.PaperDetailUnitDtoAssembler;
 import com.qmth.cqb.paper.assemble.PaperDtoAssembler;
 import com.qmth.cqb.paper.assemble.SubQuestionDtoAssembler;
 
+import com.qmth.cqb.paper.dao.nativedriver.PaperDetailUnitNativeRepo;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.SystemUtils;
 import org.bson.types.ObjectId;
@@ -146,6 +147,9 @@ public class ExtractConfigServiceImpl implements ExtractConfigService {
 	@Autowired
 	private RedisTemplate redisTemplate;
 
+	@Autowired
+	private PaperDetailUnitNativeRepo detailUnitNativeRepo;
+
 
 	@Override
 	public ExtractConfig findConfig(ExtractConfig condition) {
@@ -279,6 +283,27 @@ public class ExtractConfigServiceImpl implements ExtractConfigService {
 		return true;
 	}
 
+	public boolean checkIsAllQbjectiveByPdu(List<PaperDetailUnit> paperDetailUnits) {
+		for(PaperDetailUnit paperDetailUnit:paperDetailUnits){
+			Question question = paperDetailUnit.getQuestion();
+			//填空或问答
+			if(question.getQuestionType()==QuesStructType.FILL_BLANK_QUESTION
+					||question.getQuestionType()==QuesStructType.TEXT_ANSWER_QUESTION){
+				return false;
+			}
+			if(question.getQuestionType()==QuesStructType.NESTED_ANSWER_QUESTION){
+				List<Question> subQuestions = question.getSubQuestions();
+				for(Question subQuestion:subQuestions){
+					if(subQuestion.getQuestionType()==QuesStructType.FILL_BLANK_QUESTION
+							||subQuestion.getQuestionType()==QuesStructType.TEXT_ANSWER_QUESTION){
+						return false;
+					}
+				}
+			}
+		}
+		return true;
+	}
+
 	@Override
 	public Map<String, String> makePaperByConfig(ExtractConfig extractConfig) {
 		Map<String, String> finishedPaperIdMap = new HashMap<String, String>();
@@ -612,6 +637,108 @@ public class ExtractConfigServiceImpl implements ExtractConfigService {
         redisTemplate.opsForValue().set(paperDto.getId(),paperDto);
 		return paperDto;
 	}
+
+	/**
+	 * 测试获取paperDto
+	 * @param basePaperId
+	 * @return
+	 */
+	public PaperDto getPaperDtoByPaperNew(String basePaperId){
+
+		long beginTime = System.currentTimeMillis();
+		//没有则重新组装
+		Paper paper = paperRepo.findOne(basePaperId);
+		PaperDto paperDto = paperDtoAssembler.toDto(paper);
+		paperDto.setBasePaperId(basePaperId);
+
+		long paperDtoEndTime = System.currentTimeMillis();
+		logger.info("单独组装paperDto耗时:"+(paperDtoEndTime - beginTime)+"ms");
+
+		//将小题全部取出来,只取一次
+		List<PaperDetailUnit> allPaperDetailUnits = detailUnitNativeRepo.findByPaperId(paper.getId());
+		long pduEndTime = System.currentTimeMillis();
+		logger.info("数据库取小题耗时:"+(pduEndTime - paperDtoEndTime)+"ms");
+		Collections.sort(allPaperDetailUnits);
+		long pduSortEndTime = System.currentTimeMillis();
+		logger.info("排序小题耗时:"+(pduSortEndTime - pduEndTime)+"ms");
+
+
+		paperDto.setAllQbjectiveQuestion(checkIsAllQbjectiveByPdu(allPaperDetailUnits));
+		long isAllObjEndtime = System.currentTimeMillis();
+		logger.info("设置客观题耗时:"+(isAllObjEndtime - pduSortEndTime)+"ms");
+
+
+		//获取大题
+		List<PaperDetail> paperDetails = paperDetailRepo.findByPaper(paper);
+		long pdEndTime = System.currentTimeMillis();
+		logger.info("数据库取大题耗时:"+(pdEndTime - isAllObjEndtime)+"ms");
+		Collections.sort(paperDetails);
+		long pdSortEndTime = System.currentTimeMillis();
+		logger.info("排序大题耗时:"+(pdSortEndTime - pdEndTime)+"ms");
+
+		//抽取大题Id对应的小题
+		Map<String,List<PaperDetailUnit>> pduMap = allPaperDetailUnits.stream()
+				.collect(Collectors.groupingBy(PaperDetailUnit::getDetailId));
+		long pduMapEndTime = System.currentTimeMillis();
+		logger.info("获取大题与小题对应关系耗时:"+(pduMapEndTime - pdSortEndTime)+"ms");
+
+		// 获取大题Dto
+		List<PaperDetailDto> paperDetailDtos = paperDetailDtoAssembler.toDtoList(paperDetails);
+		paperDto.setPaperDetails(paperDetailDtos);
+		long paperDetailDtoEndTime = System.currentTimeMillis();
+		logger.info("单独组装paperDetailDto耗时:"+(paperDetailDtoEndTime - pduMapEndTime)+"ms");
+
+		// 封装小题
+		for (int i = 0; i < paperDetailDtos.size(); i++) {
+			//根据大题查出大题下面的小题
+			PaperDetail paperDetail = paperDetails.get(i);
+
+			List<PaperDetailUnit> paperDetailUnits = pduMap.get(paperDetail.getId());
+
+			List<PaperDetailUnitDto> paperDetailUnitDtos = new ArrayList<>();
+			for (int j = 0; j < paperDetailUnits.size(); j++) {
+				PaperDetailUnit paperDetailUnit = paperDetailUnits.get(j);
+				if(paperDetailUnit==null||paperDetailUnit.getQuestion()==null){
+					break;
+				}
+				//设置答案
+				setSelectQuestionAnswerUnit(paperDetailUnit);
+
+				PaperDetailUnitDto unitDto = paperDetailUnitDtoAssembler.toDto(paperDetailUnit);
+				/**
+				 * 此处不能传questionId,需要传paperDetailUnitId
+				 * 因为选项乱序在paperDetailUnit里
+				 * unitDto.setQuesId(paperDetailUnit.getQuestion().getId());
+				 */
+				unitDto.setQuesId(paperDetailUnit.getId());
+				String answer = paperDetailUnit.getQuestion().getQuesAnswer();
+				if (StringUtils.isNotEmpty(answer)){
+					unitDto.setAnswer(answer);
+				}
+				if (unitDto.getQuestionType() == QuesStructType.NESTED_ANSWER_QUESTION) {// 假如是套题
+					List<Question> subQuesList = paperDetailUnit.getQuestion().getSubQuestions();
+					List<SubQuestionDto> subQuesDtos = subQuestionDtoAssembler.toDtoList(subQuesList);
+					for (int m = 0; m < subQuesList.size(); m++) {
+						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());
+						}
+						subQuesDtos.get(m).setNumber(m + 1);
+						//套题分数从小题类中取值
+						subQuesDtos.get(m).setScore(paperDetailUnit.getSubScoreList().get(m));
+					}
+					unitDto.setSubQuestions(subQuesDtos);
+				}
+				paperDetailUnitDtos.add(unitDto);
+			}
+			paperDetailDtos.get(i).setPaperDetailUnits(paperDetailUnitDtos);
+			paperDetailDtos.get(i).setCnNum(CommonUtils.toCHNum(paperDetailDtos.get(i).getNumber()));
+		}
+		long paperDetailUnitDtoEndTime = System.currentTimeMillis();
+		logger.info("单独组装paperDetailUnitDto耗时:"+(paperDetailUnitDtoEndTime - paperDetailDtoEndTime)+"ms");
+		return paperDto;
+	}
 	
 	private void setSelectQuestoionAnswer(List<PaperDetailUnit> paperDetailUnits) {
 		for (PaperDetailUnit paperDetailUnit : paperDetailUnits) {

+ 12 - 0
cqb-paper/src/main/java/com/qmth/cqb/paper/web/ExtractConfigController.java

@@ -242,5 +242,17 @@ public class ExtractConfigController {
 			return new ResponseEntity<Object>(HttpStatus.INTERNAL_SERVER_ERROR);
 		}
 	}
+
+	@ApiOperation(value = "测试获取试卷Dto", notes = "测试获取试卷Dto")
+	@GetMapping(value = "/extract/getPaperDto/{paperId}")
+	public ResponseEntity getPaperDto(@PathVariable String paperId) {
+		try{
+			PaperDto paperDto = extractConfigService.getPaperDtoByPaperNew(paperId);
+			return new ResponseEntity<Object>(paperDto, HttpStatus.OK);
+		}catch(Exception e){
+			logger.error("获取试卷Dto失败",e);
+			return new ResponseEntity<Object>(HttpStatus.INTERNAL_SERVER_ERROR);
+		}
+	}
 	
 }	

+ 38 - 0
cqb-starter/src/main/java/com/qmth/cqb/mongo/NativeMongoConfig.java

@@ -0,0 +1,38 @@
+package com.qmth.cqb.mongo;
+
+import com.mongodb.MongoClient;
+import com.mongodb.client.MongoCollection;
+import com.mongodb.client.MongoDatabase;
+import com.qmth.cqb.paper.model.PaperDetailUnit;
+import org.bson.Document;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * Created by songyue on 18/1/29.
+ */
+@Configuration
+public class NativeMongoConfig {
+
+    private static final String DB_NAME = "comm-ques-bank";
+
+    private static final String PDU_COLLECTION_NAME = "paperDetailUnit";
+
+    @Autowired
+    private MongoClient mongoClient;
+
+    @Bean
+    @Qualifier("mongoDatabase")
+    MongoDatabase getMongoDatabase(){
+        return mongoClient.getDatabase(DB_NAME);
+    }
+
+    @Bean
+    @Qualifier("pduCollection")
+    MongoCollection<Document> getMongoPduCollection(){
+        MongoDatabase database = getMongoDatabase();
+        return database.getCollection(PDU_COLLECTION_NAME);
+    }
+}

+ 49 - 0
cqb-starter/src/test/java/com/qmth/cqb/PduNativeTest.java

@@ -0,0 +1,49 @@
+package com.qmth.cqb;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.qmth.cqb.paper.dao.PaperDetailUnitRepo;
+import com.qmth.cqb.paper.dao.nativedriver.PaperDetailUnitNativeRepo;
+import com.qmth.cqb.paper.model.Paper;
+import com.qmth.cqb.paper.model.PaperDetailUnit;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.util.List;
+
+/**
+ * Created by songyue on 18/1/29.
+ */
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class PduNativeTest {
+
+    private static final Logger log = LoggerFactory.getLogger(PduNativeTest.class);
+
+    @Autowired
+    private PaperDetailUnitNativeRepo paperDetailUnitNativeRepo;
+
+    @Autowired
+    private PaperDetailUnitRepo paperDetailUnitRepo;
+
+    @Test
+    public void testFind(){
+        long beginTime = System.currentTimeMillis();
+        List<PaperDetailUnit> pduList = paperDetailUnitNativeRepo.findByPaperId("591cf69b90994d7427e67008");
+        log.info("原生driver共耗时:"+(System.currentTimeMillis() - beginTime) +"ms");
+        System.out.printf(pduList.toString());
+    }
+
+    @Test
+    public void testFind1(){
+        long beginTime = System.currentTimeMillis();
+        List<PaperDetailUnit> pduList = paperDetailUnitRepo.findByPaperId("591cf69b90994d7427e67008");
+        log.info("spring data共耗时:"+(System.currentTimeMillis() - beginTime) +"ms");
+        System.out.printf(pduList.toString());
+    }
+}