Ver Fonte

提交Master后端

weiwenhai há 6 anos atrás
pai
commit
2368803a6f
29 ficheiros alterados com 1276 adições e 240 exclusões
  1. 0 68
      examcloud-core-questions-api-client/pom.xml
  2. 0 0
      examcloud-core-questions-api-client/src/main/java/cn/com/qmth/examcloud/core/questions/api/client/ExtractConfigCloudServiceClient.java
  3. 0 20
      examcloud-core-questions-api-client/src/test/java/org/examcloud/core/questions/api/client/AppTest.java
  4. 2 2
      examcloud-core-questions-api-provider/pom.xml
  5. 0 13
      examcloud-core-questions-api-provider/src/main/java/cn/com/qmth/examcloud/core/questions/api/provider/App.java
  6. 92 0
      examcloud-core-questions-api-provider/src/main/java/cn/com/qmth/examcloud/core/questions/api/provider/ExtractConfigCloudServiceProvider.java
  7. 0 5
      examcloud-core-questions-api-provider/src/main/java/cn/com/qmth/examcloud/service/core/api/PaperStructController.java
  8. 0 68
      examcloud-core-questions-api/pom.xml
  9. 0 13
      examcloud-core-questions-api/src/main/java/org/examcloud/core/questions/api/App.java
  10. 0 20
      examcloud-core-questions-api/src/test/java/org/examcloud/core/questions/api/AppTest.java
  11. 5 1
      examcloud-core-questions-base/pom.xml
  12. 2 0
      examcloud-core-questions-base/src/main/java/cn/com/qmth/examcloud/core/questions/base/CommonUtils.java
  13. 2 0
      examcloud-core-questions-dao/src/main/java/cn/com/qmth/examcloud/core/questions/dao/CourseRepo.java
  14. 3 1
      examcloud-core-questions-dao/src/main/java/cn/com/qmth/examcloud/core/questions/dao/QuesRepo.java
  15. 1 0
      examcloud-core-questions-service/pom.xml
  16. 33 0
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/ExtractConfigProviderService.java
  17. 2 0
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/ImportPaperService.java
  18. 6 0
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/PaperDetailUnitService.java
  19. 22 18
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/ExportPaperAbstractService.java
  20. 6 2
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/InitPaperExpService.java
  21. 551 0
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/impl/ExtractConfigProviderServiceImpl.java
  22. 75 0
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/impl/PaperDetailUnitServiceImpl.java
  23. 5 1
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/impl/PaperServiceImpl.java
  24. 382 0
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/temp/DdExcelService.java
  25. 63 0
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/temp/vo/DdExcelDto.java
  26. 3 3
      examcloud-core-questions-starter/src/main/resources/application-dev.properties
  27. 5 3
      examcloud-core-questions-starter/src/main/resources/application.properties
  28. 1 1
      examcloud-core-questions-starter/src/main/resources/logback-spring.xml
  29. 15 1
      examcloud-core-questions-starter/src/test/java/cn/com/qmth/examcloud/core/questions/starter/DdCollegeUtilTest.java

+ 0 - 68
examcloud-core-questions-api-client/pom.xml

@@ -1,68 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-        <artifactId>examcloud-core-questions</artifactId>
-        <groupId>cn.com.qmth.examcloud.core.questions</groupId>
-        <version>2.0-SNAPSHOT</version>
-    </parent>
-
-  <groupId>cn.com.qmth.examcloud.core.questions</groupId>
-  <artifactId>examcloud-core-questions-api-client</artifactId>
-  <version>2.0-SNAPSHOT</version>
-
-  <name>examcloud-core-questions-api-client</name>
-  <!-- FIXME change it to the project's website -->
-  <url>http://www.example.com</url>
-
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <maven.compiler.source>1.7</maven.compiler.source>
-    <maven.compiler.target>1.7</maven.compiler.target>
-  </properties>
-
-  <dependencies>
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>4.11</version>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
-
-  <build>
-    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
-      <plugins>
-        <plugin>
-          <artifactId>maven-clean-plugin</artifactId>
-          <version>3.0.0</version>
-        </plugin>
-        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
-        <plugin>
-          <artifactId>maven-resources-plugin</artifactId>
-          <version>3.0.2</version>
-        </plugin>
-        <plugin>
-          <artifactId>maven-compiler-plugin</artifactId>
-          <version>3.7.0</version>
-        </plugin>
-        <plugin>
-          <artifactId>maven-surefire-plugin</artifactId>
-          <version>2.20.1</version>
-        </plugin>
-        <plugin>
-          <artifactId>maven-jar-plugin</artifactId>
-          <version>3.0.2</version>
-        </plugin>
-        <plugin>
-          <artifactId>maven-install-plugin</artifactId>
-          <version>2.5.2</version>
-        </plugin>
-        <plugin>
-          <artifactId>maven-deploy-plugin</artifactId>
-          <version>2.8.2</version>
-        </plugin>
-      </plugins>
-    </pluginManagement>
-  </build>
-</project>

+ 0 - 0
examcloud-core-questions-api-client/src/main/java/org/examcloud/core/questions/api/client/App.java → examcloud-core-questions-api-client/src/main/java/cn/com/qmth/examcloud/core/questions/api/client/ExtractConfigCloudServiceClient.java


+ 0 - 20
examcloud-core-questions-api-client/src/test/java/org/examcloud/core/questions/api/client/AppTest.java

@@ -1,20 +0,0 @@
-package org.examcloud.core.questions.api.client;
-
-import static org.junit.Assert.assertTrue;
-
-import org.junit.Test;
-
-/**
- * Unit test for simple App.
- */
-public class AppTest 
-{
-    /**
-     * Rigorous Test :-)
-     */
-    @Test
-    public void shouldAnswerWithTrue()
-    {
-        assertTrue( true );
-    }
-}

+ 2 - 2
examcloud-core-questions-api-provider/pom.xml

@@ -12,8 +12,8 @@
 
 	<dependencies>
 		<dependency>
-			<groupId>cn.com.qmth.examcloud.core.questions</groupId>
-			<artifactId>examcloud-core-questions-api</artifactId>
+			<groupId>cn.com.qmth.examcloud.rmi</groupId>
+			<artifactId>examcloud-core-questions-api-client</artifactId>
 			<version>${examcloud.version}</version>
 		</dependency>
 		<dependency>

+ 0 - 13
examcloud-core-questions-api-provider/src/main/java/cn/com/qmth/examcloud/core/questions/api/provider/App.java

@@ -1,13 +0,0 @@
-package cn.com.qmth.examcloud.core.questions.api.provider;
-
-/**
- * Hello world!
- *
- */
-public class App 
-{
-    public static void main( String[] args )
-    {
-        System.out.println( "Hello World!" );
-    }
-}

+ 92 - 0
examcloud-core-questions-api-provider/src/main/java/cn/com/qmth/examcloud/core/questions/api/provider/ExtractConfigCloudServiceProvider.java

@@ -0,0 +1,92 @@
+package cn.com.qmth.examcloud.core.questions.api.provider;
+
+import java.util.Map;
+
+import io.swagger.annotations.ApiOperation;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import cn.com.qmth.examcloud.commons.base.exception.StatusException;
+import cn.com.qmth.examcloud.core.questions.api.ExtractConfigCloudService;
+import cn.com.qmth.examcloud.core.questions.api.request.GetPaperReq;
+import cn.com.qmth.examcloud.core.questions.api.request.GetQuestionReq;
+import cn.com.qmth.examcloud.core.questions.api.response.GetPaperResp;
+import cn.com.qmth.examcloud.core.questions.api.response.GetQuestionResp;
+import cn.com.qmth.examcloud.core.questions.service.ExtractConfigProviderService;
+import cn.com.qmth.examcloud.question.core.paper.DefaultPaper;
+import cn.com.qmth.examcloud.question.core.question.DefaultQuestion;
+
+/**
+ * @author 		weiwenhai
+ * @date		2018.8.15
+ * @company		qmth
+ * @describle	调卷规则远程调用请求接口实现类
+ * @code		010
+ */
+@Transactional
+@RestController
+@RequestMapping("${$rmp.cloud.questions}" + "extract_config")
+public class ExtractConfigCloudServiceProvider implements ExtractConfigCloudService{
+
+	private static final long serialVersionUID = 2346453260179681094L;
+	
+	@Autowired
+	private ExtractConfigProviderService extractConfigExamService;
+
+	@ApiOperation(value = "根据调卷规则抽取考试试卷")
+	@PostMapping("getPaper")
+	@Override
+	public GetPaperResp getPaper(@RequestBody GetPaperReq paperReq) {
+		Long examId = paperReq.getExamId();
+		if (null == examId) {
+			throw new StatusException("Q-010036", "examId is null");
+		}
+		String courseCode = paperReq.getCourseCode(); 
+		if(StringUtils.isBlank(courseCode)){
+			throw new StatusException("Q-010040", "courseCode is null");
+		}
+		String groupCode = paperReq.getGroupCode();
+		if(StringUtils.isBlank(groupCode)){
+			throw new StatusException("Q-010045", "groupCode is null");
+		}
+		Map<String, Object> map = extractConfigExamService.getDefaultPaper(paperReq.getExamId(),paperReq.getCourseCode(),paperReq.getGroupCode());
+		GetPaperResp resp = new GetPaperResp();
+		resp.setSortQptionOrder((Short)map.get("upSetOptionOrder") == 0 ? false:true);
+		resp.setSortQuestionOrder((Short)map.get("upSetQuestionOrder") == 0 ? false:true);
+		resp.setDefaultPaper((DefaultPaper)map.get("defaultPaper"));
+		return resp;
+	}
+
+	@ApiOperation(value = "根据调卷规则抽取考试试卷")
+	@PostMapping("getQuestion")
+	@Override
+	public GetQuestionResp getQuestion(@RequestBody GetQuestionReq questionReq) {
+		Long examId = questionReq.getExamId();
+		if (null == examId) {
+			throw new StatusException("Q-010071", "examId is null");
+		}
+		String courseCode = questionReq.getCourseCode(); 
+		if(StringUtils.isBlank(courseCode)){
+			throw new StatusException("Q-010075", "courseCode is null");
+		}
+		String groupCode = questionReq.getGroupCode();
+		if(StringUtils.isBlank(groupCode)){
+			throw new StatusException("Q-010079", "groupCode is null");
+		}
+		String questionId = questionReq.getQuestionId();
+		if(StringUtils.isBlank(questionId)){
+			throw new StatusException("Q-010083", "questionId is null");
+		}
+		DefaultQuestion defaultQuestion = extractConfigExamService.getDefaultQuestion(examId, courseCode, groupCode, questionId);
+		GetQuestionResp resp = new GetQuestionResp();
+		resp.setDefaultQuestion(defaultQuestion);
+		return resp;
+	}
+	
+}

+ 0 - 5
examcloud-core-questions-api-provider/src/main/java/cn/com/qmth/examcloud/service/core/api/PaperStructController.java

@@ -50,7 +50,6 @@ public class PaperStructController extends ControllerSupport {
                                           @PathVariable int curPage,
                                           @PathVariable int pageSize) {
         User user = getAccessUser();
-    	//AccessUser accessUser = (AccessUser) request.getAttribute("accessUser");
         if(user != null){
             searchInfo.setOrgId(user.getRootOrgId().toString());
         }
@@ -67,7 +66,6 @@ public class PaperStructController extends ControllerSupport {
     @GetMapping(value = "/paperStruct")
     public ResponseEntity getPaperStructs(HttpServletRequest request,@ModelAttribute PaperStructSearchInfo searchInfo) {
     	User user = getAccessUser();
-    	//AccessUser accessUser = (AccessUser) request.getAttribute("accessUser");
         if(user != null){
             searchInfo.setOrgId(user.getRootOrgId().toString());
         }
@@ -97,7 +95,6 @@ public class PaperStructController extends ControllerSupport {
     @PutMapping(value = "/paperStruct")
     public ResponseEntity updatePaperStruct(HttpServletRequest request, @RequestBody PaperStruct ps) {
     	User user = getAccessUser();
-    	//AccessUser user = (AccessUser) request.getAttribute("accessUser");
         PaperStruct paperStruct = paperStructService.save(ps, user);
         if (paperStruct == null) {
             return new ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR);
@@ -117,7 +114,6 @@ public class PaperStructController extends ControllerSupport {
     @PostMapping(value = "/paperStruct")
     public ResponseEntity addPaperStruct(HttpServletRequest request, @RequestBody PaperStruct ps) {
     	User user = getAccessUser();
-    	//AccessUser user = (AccessUser) request.getAttribute("accessUser");
         PaperStruct paperStructTemp = paperStructService.checkNameUnique(ps.getName(), user.getRootOrgId().toString(),ps.getType());
         if (paperStructTemp != null) {
             return new ResponseEntity("试卷结构名称重复,请重新命名!", HttpStatus.INTERNAL_SERVER_ERROR);
@@ -153,7 +149,6 @@ public class PaperStructController extends ControllerSupport {
                                              @RequestParam QuesStructType quesType) {
         List<QuesNameDto> quesNameDtos = new ArrayList<>();
         User user = getAccessUser();
-        //AccessUser user = (AccessUser) request.getAttribute("accessUser");
         if(user != null){
             quesNameDtos = paperStructService.getQuesNameList(user.getRootOrgId().toString(),courseNo,quesType);
         }

+ 0 - 68
examcloud-core-questions-api/pom.xml

@@ -1,68 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-        <artifactId>examcloud-core-questions</artifactId>
-        <groupId>cn.com.qmth.examcloud.core.questions</groupId>
-        <version>2.0-SNAPSHOT</version>
-    </parent>
-
-  <groupId>cn.com.qmth.examcloud.core.questions</groupId>
-  <artifactId>examcloud-core-questions-api</artifactId>
-  <version>2.0-SNAPSHOT</version>
-
-  <name>examcloud-core-questions-api</name>
-  <!-- FIXME change it to the project's website -->
-  <url>http://www.example.com</url>
-
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <maven.compiler.source>1.7</maven.compiler.source>
-    <maven.compiler.target>1.7</maven.compiler.target>
-  </properties>
-
-  <dependencies>
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>4.11</version>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
-
-  <build>
-    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
-      <plugins>
-        <plugin>
-          <artifactId>maven-clean-plugin</artifactId>
-          <version>3.0.0</version>
-        </plugin>
-        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
-        <plugin>
-          <artifactId>maven-resources-plugin</artifactId>
-          <version>3.0.2</version>
-        </plugin>
-        <plugin>
-          <artifactId>maven-compiler-plugin</artifactId>
-          <version>3.7.0</version>
-        </plugin>
-        <plugin>
-          <artifactId>maven-surefire-plugin</artifactId>
-          <version>2.20.1</version>
-        </plugin>
-        <plugin>
-          <artifactId>maven-jar-plugin</artifactId>
-          <version>3.0.2</version>
-        </plugin>
-        <plugin>
-          <artifactId>maven-install-plugin</artifactId>
-          <version>2.5.2</version>
-        </plugin>
-        <plugin>
-          <artifactId>maven-deploy-plugin</artifactId>
-          <version>2.8.2</version>
-        </plugin>
-      </plugins>
-    </pluginManagement>
-  </build>
-</project>

+ 0 - 13
examcloud-core-questions-api/src/main/java/org/examcloud/core/questions/api/App.java

@@ -1,13 +0,0 @@
-package org.examcloud.core.questions.api;
-
-/**
- * Hello world!
- *
- */
-public class App 
-{
-    public static void main( String[] args )
-    {
-        System.out.println( "Hello World!" );
-    }
-}

+ 0 - 20
examcloud-core-questions-api/src/test/java/org/examcloud/core/questions/api/AppTest.java

@@ -1,20 +0,0 @@
-package org.examcloud.core.questions.api;
-
-import static org.junit.Assert.assertTrue;
-
-import org.junit.Test;
-
-/**
- * Unit test for simple App.
- */
-public class AppTest 
-{
-    /**
-     * Rigorous Test :-)
-     */
-    @Test
-    public void shouldAnswerWithTrue()
-    {
-        assertTrue( true );
-    }
-}

+ 5 - 1
examcloud-core-questions-base/pom.xml

@@ -95,7 +95,11 @@
 		  	<artifactId>jsoup</artifactId>
 		  	<version>1.11.3</version>
 		</dependency>
-		
+		<dependency>
+			<groupId>cn.com.qmth.examcloud.question</groupId>
+			<artifactId>examcloud-question-commons</artifactId>
+			<version>${examcloud.version}</version>
+		</dependency>
 	</dependencies>
 
 </project>

+ 2 - 0
examcloud-core-questions-base/src/main/java/cn/com/qmth/examcloud/core/questions/base/CommonUtils.java

@@ -27,6 +27,8 @@ import java.util.stream.Stream;
  */
 public final class CommonUtils {
 
+	public static final String QUESTION_VERSION = "1.0";
+	
     private static final String COMMON_PROPERTIES = "common.properties";
 
     private static final String[] CN_SMALL_NUM = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"};

+ 2 - 0
examcloud-core-questions-dao/src/main/java/cn/com/qmth/examcloud/core/questions/dao/CourseRepo.java

@@ -15,5 +15,7 @@ public interface CourseRepo extends MongoRepository<Course, String>,QueryByExamp
     Course findFirstByCodeAndOrgId(String code,String orgId);
 
     Course findFirstByCode(String courseNo);
+    
+    List<Course> findByOrgId(String orgId);
 
 }

+ 3 - 1
examcloud-core-questions-dao/src/main/java/cn/com/qmth/examcloud/core/questions/dao/QuesRepo.java

@@ -1,7 +1,7 @@
 package cn.com.qmth.examcloud.core.questions.dao;
 
 import cn.com.qmth.examcloud.core.questions.base.question.enums.QuesStructType;
-
+import cn.com.qmth.examcloud.core.questions.dao.entity.Course;
 import cn.com.qmth.examcloud.core.questions.dao.entity.Question;
 
 import org.springframework.data.domain.Page;
@@ -25,4 +25,6 @@ public interface QuesRepo extends MongoRepository<Question, String>, QueryByExam
     List<Question> findByCourseNoAndOrgId(String courseNo, String orgId);
     
     List<Question> findBySpecialtyCodeAndOrgId(String specialtyCode,String orgId);
+    
+    List<Question> findByCourseAndOrgId(Course course,String orgId);
 }

+ 1 - 0
examcloud-core-questions-service/pom.xml

@@ -16,6 +16,7 @@
 			<artifactId>examcloud-core-questions-dao</artifactId>
 			<version>${examcloud.version}</version>
 		</dependency>
+		
 	</dependencies>
 
 </project>

+ 33 - 0
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/ExtractConfigProviderService.java

@@ -0,0 +1,33 @@
+package cn.com.qmth.examcloud.core.questions.service;
+
+import java.util.Map;
+
+import cn.com.qmth.examcloud.core.questions.dao.entity.Paper;
+import cn.com.qmth.examcloud.question.core.question.DefaultQuestion;
+
+/**
+ * @author 		weiwenhai
+ * @date 		2018.8.15
+ * @company		qmth
+ * @describle	调卷规则远程接口
+ */
+public interface ExtractConfigProviderService {
+
+	/**
+	 * 根据调卷规则抽取试卷
+	 * @param req
+	 * @return
+	 */
+	public Map<String, Object> getDefaultPaper(Long examId,String courseCode,String groupCode);
+	
+	/**
+	 * 
+	 * @param exam_id
+	 * @param course_code
+	 * @param group_code
+	 * @param questionId
+	 * @return
+	 */
+	public DefaultQuestion getDefaultQuestion(Long examId,String courseCode,String groupCode,String questionId);
+	
+}

+ 2 - 0
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/ImportPaperService.java

@@ -1467,6 +1467,8 @@ public class ImportPaperService {
             returnMap.put("msg", msg);
             return returnMap;
         }
+        paper.setCourseName(courseName);
+        paper.setCourseNo(courseNo);
         initPaper(paper, paperName, user);
         PaperDetail pd = new PaperDetail();
         pd.setId(UUID.randomUUID().toString());

+ 6 - 0
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/PaperDetailUnitService.java

@@ -89,4 +89,10 @@ public interface PaperDetailUnitService {
      * @return
      */
     public List<PaperDetailUnit> findByQuestionsAndPaperType(List<String> ids,PaperType paperType);
+    
+    public List<PaperDetailUnit> findByDDQuestionsAndPaperType(List<String> ids,PaperType paperType,List<Question> questionList);
+    
+    public List<PaperDetailUnit> testFind(List<String> ids,PaperType paperType,List<Question> questionList);
+    
+    public List<PaperDetailUnit> findByPaperIds(List<String> ids);
 }

+ 22 - 18
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/ExportPaperAbstractService.java

@@ -1481,30 +1481,34 @@ public abstract class ExportPaperAbstractService {
 		return paperType;
     }
     
+    
     /**
      * 下载试卷音频
      * @param paperId
      * @param zipFileName
      */
 	public void downloadAudio(PaperExp paperExp, String zipFileName) {
-		//取到所有大题
-		List<PaperDetailExp> paperDetailExps = paperExp.getPaperDetails();
-		if(paperDetailExps != null && paperDetailExps.size()>0){
-			for(PaperDetailExp paperDetailExp:paperDetailExps){
-				//取到所有小题
-				List<PaperDetailUnitExp> paperDetailUnitExps = paperDetailExp.getPaperDetailUnits();
-				if(paperDetailUnitExps != null && paperDetailUnitExps.size()>0){
-					for(PaperDetailUnitExp unit:paperDetailUnitExps){
-						if(unit.getQuestion().getHasAudio()!=null&&unit.getQuestion().getHasAudio()){
-							List<QuestionAudio> questionAudios = questionAudioService.findQuestionAudiosByQuestionId(unit.getQuestion().getId());
-							for(QuestionAudio audio:questionAudios){
-								String audioFileName = paperExp.getCourseName()
-														+"_"+paperExp.getName()
-														+"_试卷_"
-														+"_"+getAudioFileName(audio,unit,paperDetailExp);
-								UpYun upyun = new UpYun(bucketName,userName,password);
-								File file = new File(TEMP_FILE_EXP+File.separator+zipFileName+File.separator+audioFileName);
-								upyun.readFile(audio.getFileUrl(), file);
+		//先判断是否是音频试卷
+		if(paperExp.getHasAudio() != null && paperExp.getHasAudio() == true){
+			//取到所有大题
+			List<PaperDetailExp> paperDetailExps = paperExp.getPaperDetails();
+			if(paperDetailExps != null && paperDetailExps.size()>0){
+				for(PaperDetailExp paperDetailExp:paperDetailExps){
+					//取到所有小题
+					List<PaperDetailUnitExp> paperDetailUnitExps = paperDetailExp.getPaperDetailUnits();
+					if(paperDetailUnitExps != null && paperDetailUnitExps.size()>0){
+						for(PaperDetailUnitExp unit:paperDetailUnitExps){
+							if(unit.getQuestion().getHasAudio()!=null&&unit.getQuestion().getHasAudio()){
+								List<QuestionAudio> questionAudios = questionAudioService.findQuestionAudiosByQuestionId(unit.getQuestion().getId());
+								for(QuestionAudio audio:questionAudios){
+									String audioFileName = paperExp.getCourseName()
+															+"_"+paperExp.getName()
+															+"_试卷_"
+															+"_"+getAudioFileName(audio,unit,paperDetailExp);
+									UpYun upyun = new UpYun(bucketName,userName,password);
+									File file = new File(TEMP_FILE_EXP+File.separator+zipFileName+File.separator+audioFileName);
+									upyun.readFile(audio.getFileUrl(), file);
+								}
 							}
 						}
 					}

+ 6 - 2
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/InitPaperExpService.java

@@ -141,7 +141,7 @@ public  class InitPaperExpService {
     	//获取原试卷所有大题
     	List<PaperDetail> paperDetails = paperDetailRepo.findByPaperOrderByNumber(paper);
     	//生成新的大题对象集合,加添对应的小题
-    	List<PaperDetailExp> paperDetailExps = separatePaperDetailUntils(paperDetails);
+    	List<PaperDetailExp> paperDetailExps = separatePaperDetailUntils(paperDetails,paperExpDto);
     	//给新的大题集合排序,计算小题数量
     	sortPaperDetailExps(paperDetailExps);
     	//给新的大题添加分数
@@ -155,7 +155,7 @@ public  class InitPaperExpService {
      * @param paperDetails
      * @return
      */
-    private List<PaperDetailExp> separatePaperDetailUntils(List<PaperDetail> paperDetails){
+    private List<PaperDetailExp> separatePaperDetailUntils(List<PaperDetail> paperDetails,PaperExp paperExpDto){
     	List<PaperDetailExp> paperDetailExps = new ArrayList<PaperDetailExp>();
     	//循环大题
     	for(PaperDetail paperDetail:paperDetails){
@@ -167,6 +167,10 @@ public  class InitPaperExpService {
     		List<PaperDetailExp> subPaperDetailExps = new ArrayList<PaperDetailExp>();
     		//第一次循环小题,分成大题类型
     		for(PaperDetailUnit paperDetailUnit:paperDetailUnits){
+    			//判断该试卷是否为音频试卷
+    			if(paperDetailUnit.getQuestion().getHasAudio() !=null && paperDetailUnit.getQuestion().getHasAudio()){
+    				paperExpDto.setHasAudio(true);	//设置试卷含有音频
+            	}
     			//如果是套题
     			if(paperDetailUnit.getQuestionType().getName().equals("套题")){
     				isSubQuestion(paperDetailUnit,questionTypes);

+ 551 - 0
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/impl/ExtractConfigProviderServiceImpl.java

@@ -0,0 +1,551 @@
+package cn.com.qmth.examcloud.core.questions.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.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.data.domain.Example;
+import org.springframework.stereotype.Service;
+
+import com.netflix.infix.lang.infix.antlr.EventFilterParser.boolean_expr_return;
+
+import cn.com.qmth.examcloud.commons.base.exception.StatusException;
+import cn.com.qmth.examcloud.commons.base.logging.ExamCloudLog;
+import cn.com.qmth.examcloud.commons.base.logging.ExamCloudLogFactory;
+import cn.com.qmth.examcloud.core.questions.base.CommonUtils;
+import cn.com.qmth.examcloud.core.questions.base.question.PaperDto;
+import cn.com.qmth.examcloud.core.questions.base.question.enums.QuesStructType;
+import cn.com.qmth.examcloud.core.questions.dao.AudioTimeConfigRepo;
+import cn.com.qmth.examcloud.core.questions.dao.PaperDetailRepo;
+import cn.com.qmth.examcloud.core.questions.dao.PaperDetailUnitRepo;
+import cn.com.qmth.examcloud.core.questions.dao.PaperRepo;
+import cn.com.qmth.examcloud.core.questions.dao.QuesRepo;
+import cn.com.qmth.examcloud.core.questions.dao.entity.AudioTimeConfig;
+import cn.com.qmth.examcloud.core.questions.dao.entity.ExamPaper;
+import cn.com.qmth.examcloud.core.questions.dao.entity.ExtractConfig;
+import cn.com.qmth.examcloud.core.questions.dao.entity.Paper;
+import cn.com.qmth.examcloud.core.questions.dao.entity.PaperDetail;
+import cn.com.qmth.examcloud.core.questions.dao.entity.PaperDetailUnit;
+import cn.com.qmth.examcloud.core.questions.dao.entity.QuesOption;
+import cn.com.qmth.examcloud.core.questions.dao.entity.Question;
+import cn.com.qmth.examcloud.core.questions.dao.entity.QuestionAudio;
+import cn.com.qmth.examcloud.core.questions.service.ExtractConfigProviderService;
+import cn.com.qmth.examcloud.core.questions.service.ExtractConfigService;
+import cn.com.qmth.examcloud.core.questions.service.QuestionAudioService;
+import cn.com.qmth.examcloud.question.core.paper.DefaultPaper;
+import cn.com.qmth.examcloud.question.core.paper.DefaultQuestionGroup;
+import cn.com.qmth.examcloud.question.core.paper.DefaultQuestionStructureWrapper;
+import cn.com.qmth.examcloud.question.core.paper.DefaultQuestionUnitWrapper;
+import cn.com.qmth.examcloud.question.core.question.DefaultQuestion;
+import cn.com.qmth.examcloud.question.core.question.DefaultQuestionOption;
+import cn.com.qmth.examcloud.question.core.question.DefaultQuestionStructure;
+import cn.com.qmth.examcloud.question.core.question.DefaultQuestionUnit;
+import cn.com.qmth.examcloud.question.core.question.QuestionType;
+
+/**
+ * @author 		weiwenhai
+ * @date 		2018.8.15
+ * @company		qmth
+ * @describle	provider中的service方法
+ * @code 		020
+ */
+@Service("extractConfigCloudService")
+public class ExtractConfigProviderServiceImpl implements ExtractConfigProviderService{
+
+	protected ExamCloudLog log = ExamCloudLogFactory.getLog(this.getClass());
+	
+	@Autowired
+	private ExtractConfigService extractConfigService;
+	
+	@Autowired
+    private PaperRepo paperRepo;
+	
+	@Autowired
+	private PaperDetailRepo paperDetailRepo;
+	
+	@Autowired
+    private PaperDetailUnitRepo paperDetailUnitRepo;
+	
+	@Autowired
+    private QuesRepo quesRepo;
+	
+	@Autowired
+    private AudioTimeConfigRepo audioTimeConfigRepo;
+	
+    @Autowired
+    private QuestionAudioService questionAudioService;
+	
+	@Value("${upyun.downloadUrl}")
+	private String downloadUrl;
+	
+	@Override
+	public Map<String, Object> getDefaultPaper(Long examId,String courseCode,String groupCode) {
+		Map<String,Object> map = new HashMap<String, Object>();
+		log.debug("调卷开始...");
+		long startTime = System.currentTimeMillis();
+		log.debug("开始根据examId:"+ examId +"和courseCode:"+ courseCode +"获取调卷规则");
+		ExtractConfig extractConfig = extractConfigService.findConfig(new ExtractConfig(examId,courseCode));
+		if(extractConfig == null){
+			log.error("该考试和课程下调卷规则未制定,请先制定调卷规则,调卷程序退出");
+			throw new StatusException("Q-020033","该考试和课程下调卷规则未制定,请先制定调卷规则,调卷程序退出");
+		}
+		long configFinishTime = System.currentTimeMillis();
+		log.debug("获取调卷规则共耗时:"+ (configFinishTime - startTime)+"ms");
+		log.debug("根据调卷规则中设置的概率获取类型为"+ groupCode +"的试卷");
+		Map<String,Paper> paperMap = this.getExamPaperByProbability(extractConfig.getExamPaperList());
+		if(paperMap.isEmpty()){
+			log.error("该考试和课程下调卷规则中试卷不存在,请检查调卷规则,调卷程序退出");
+			throw new StatusException("Q-020061","该考试和课程下调卷规则中试卷不存在,请重新制定调卷规则");
+		}
+		long paperMapFinishTime = System.currentTimeMillis();
+		log.debug("获取类型为"+ groupCode +"的试卷共耗时:"+ (paperMapFinishTime - configFinishTime)+"ms");
+		Paper basePaper = paperMap.get(groupCode);
+		if(basePaper==null){
+			log.error("该考试和课程下调卷规则中该类型试卷不存在,请检查调卷规则,调卷程序退出");
+			throw new StatusException("Q-020068","该考试和课程下调卷规则中试卷不存在,请重新制定调卷规则");
+		}
+		log.debug("将原始试卷:"+ basePaper.getId() +"根据规则重新组卷");
+		Short upSetQuestionOrder = extractConfig.getScrambling_the_question_order();
+		Short upSetOptionOrder = extractConfig.getScrambling_the_option_order();
+		map.put("upSetQuestionOrder", upSetQuestionOrder);
+		map.put("upSetOptionOrder", upSetOptionOrder);
+		//构建试卷结构
+		DefaultPaper defaultPaper = buildDefaultByBasePaper(basePaper,String.valueOf(examId),courseCode,groupCode);
+		map.put("defaultPaper", defaultPaper);
+		return map;
+	}
+	
+	/**
+	 * 每个试卷类型取出一套试卷
+	 * {
+	 * 	 A:Paper,
+	 *   B:Paper
+	 * }
+	 * A是试卷类型   Paper是A类型下选定的试卷
+	 * @param examPaperList		
+	 * @return
+	 */
+	private Map<String,Paper> getExamPaperByProbability(List<ExamPaper> examPaperList){
+		Map<String,Paper> paperByTypeMap = new HashMap<String,Paper>();
+		if(examPaperList == null || examPaperList.size() == 0) {
+			throw new StatusException("Q-020114","可供抽取的试卷集合为空,无法抽取试卷"); 
+        }
+		Map<String,List<ExamPaper>> examPaperMap = new HashMap<String,List<ExamPaper>>();
+		for(int i = 0;i<examPaperList.size();i++){
+			ExamPaper examPaper = examPaperList.get(i);
+			if(!examPaperMap.containsKey(examPaper.getGroupCode())){
+				if(examPaper.getPaper()!=null){
+					List<ExamPaper> epList = new ArrayList<ExamPaper>();
+					epList.add(examPaper);
+					examPaperMap.put(examPaper.getGroupCode(), epList);
+				}
+			}else{
+				if(examPaper.getPaper()!=null){
+					List<ExamPaper> epList = examPaperMap.get(examPaper.getGroupCode());
+					epList.add(examPaper);
+				}
+			}
+		}
+		if(examPaperMap!=null){
+			Set<String> keys = examPaperMap.keySet();
+			Iterator<String> it = keys.iterator();
+			while (it.hasNext()) {
+				String key = it.next();
+				Paper paper = this.getPaperByProbability(examPaperMap.get(key));
+				//不能用原来的paper对象,否则examPaperList中的paper对象会被覆盖
+				Paper newPaper =paperRepo.findOne(paper.getId());
+				paperByTypeMap.put(key,newPaper);
+			}
+		}
+        return paperByTypeMap;
+	}
+	
+	/**
+	 * 根据设定几率取出一套试卷
+	 * @param examPaperList
+	 * @return
+	 */
+	private Paper getPaperByProbability(List<ExamPaper> examPaperList){
+		int sum = 0;  
+        for (int i = 0;i<examPaperList.size();i++) {  
+             sum += examPaperList.get(i).getWeight();  
+        }
+        // 从1开始  
+        Integer rand = new Random().nextInt(sum) + 1;  
+        for (int i = 0;i<examPaperList.size();i++) {
+            rand -= examPaperList.get(i).getWeight();
+            // 选中
+            if (rand <= 0) {
+                return examPaperList.get(i).getPaper();
+            }
+        } 
+        return null;
+	}
+
+	/**
+	 * 根据paper对象构建DefaultPaper对象
+	 * @param basePaper
+	 * @return
+	 */
+	private DefaultPaper buildDefaultByBasePaper(Paper basePaper,String examId,String courseCode,String groupCode){
+		log.debug("开始包装网考需要的试卷结构...");
+		long beginTime = System.currentTimeMillis();
+		//获取大题
+		List<PaperDetail> paperDetails = paperDetailRepo.findByPaper(basePaper);
+		long pdTime = System.currentTimeMillis();
+		log.debug("数据库取大题耗时:"+(pdTime - beginTime)+"ms");
+		Collections.sort(paperDetails);
+		long pdSortEndTime = System.currentTimeMillis();
+		log.debug("排序大题耗时:"+(pdSortEndTime - pdTime)+"ms");
+		//将小题全部取出来,只取一次,减少对数据库的查询
+		List<PaperDetailUnit> allPaperDetailUnits = paperDetailUnitRepo.findByPaper(basePaper);
+		boolean fullyObjective = checkIsAllQbjectiveQuestion(allPaperDetailUnits);
+		long pduEndTime = System.currentTimeMillis();
+		log.debug("数据库取所有小题耗时:"+(pduEndTime - pdSortEndTime)+"ms");
+		//根据大题id将小题归类
+		Map<String,List<PaperDetailUnit>> pduMap = allPaperDetailUnits.stream().collect(Collectors.groupingBy(PaperDetailUnit::getDetailId));
+		long pduMapEndTime = System.currentTimeMillis();
+		log.debug("获取大题与小题对应关系耗时:"+(pduMapEndTime - pduEndTime)+"ms");
+		log.debug("循环大题,开始组装对象...");
+		//生成新的分组集合
+		List<DefaultQuestionGroup> questionGroupList = new ArrayList<DefaultQuestionGroup>();
+		for(int i = 0; i < paperDetails.size(); i++){
+			PaperDetail paperDetail = paperDetails.get(i);
+			DefaultQuestionGroup defaultQuestionGroup = new DefaultQuestionGroup();
+			defaultQuestionGroup.setGroupName(paperDetail.getName());
+			defaultQuestionGroup.setGroupScore(paperDetail.getScore().floatValue());
+			//生成新的题包装器集合
+			List<DefaultQuestionStructureWrapper> questionWrapperList = new ArrayList<DefaultQuestionStructureWrapper>();
+			//获取原小题的集合
+			List<PaperDetailUnit> paperDetailUnits = pduMap.get(paperDetail.getId());
+			for(int j =0; j<paperDetailUnits.size(); j++){
+				PaperDetailUnit paperDetailUnit = paperDetailUnits.get(j);
+				DefaultQuestionStructureWrapper defaultQuestionStructureWrapper = new DefaultQuestionStructureWrapper();
+				defaultQuestionStructureWrapper.setQuestionId(paperDetailUnit.getQuestion().getId());
+				defaultQuestionStructureWrapper.setVersion(CommonUtils.QUESTION_VERSION);
+				defaultQuestionStructureWrapper.setQuestionScore(paperDetailUnit.getScore().floatValue());
+				//设置音频播放次数
+				if(paperDetailUnit.getQuestion().getHasAudio() != null && paperDetailUnit.getQuestion().getHasAudio() == true){
+					AudioTimeConfig audioTimeConfig = audioTimeConfigRepo.findOne(Example.of(new AudioTimeConfig(examId,courseCode,groupCode,paperDetailUnit.getQuestion().getId())));
+					defaultQuestionStructureWrapper.setPlayedTimes(audioTimeConfig.getPlayTime());
+				}
+				//生成新的题单元包装器
+				List<DefaultQuestionUnitWrapper> defaultQuestionUnitWrappers = new ArrayList<DefaultQuestionUnitWrapper>();
+				if(paperDetailUnit.getQuestion().getQuestionType() == QuesStructType.NESTED_ANSWER_QUESTION){
+					List<Question> subQuesList = paperDetailUnit.getQuestion().getSubQuestions();
+					List<Double> scoreList = paperDetailUnit.getSubScoreList();
+					if(subQuesList != null && subQuesList.size()>0){
+						for(int k =0;k<subQuesList.size();k++){
+							DefaultQuestionUnitWrapper defaultQuestionUnitWrapper = buildQuesUnitWrapper(subQuesList.get(k),scoreList.get(k));
+							defaultQuestionUnitWrappers.add(defaultQuestionUnitWrapper);
+						}
+					}
+				}else {
+					DefaultQuestionUnitWrapper defaultQuestionUnitWrapper = buildQuesUnitWrapper(paperDetailUnit.getQuestion(),paperDetailUnit.getScore());
+					defaultQuestionUnitWrappers.add(defaultQuestionUnitWrapper);
+				}
+				defaultQuestionStructureWrapper.setQuestionUnitWrapperList(defaultQuestionUnitWrappers);
+				questionWrapperList.add(defaultQuestionStructureWrapper);
+			}
+			defaultQuestionGroup.setQuestionWrapperList(questionWrapperList);
+			questionGroupList.add(defaultQuestionGroup);
+		}
+		DefaultPaper defaultPaper = new DefaultPaper();
+		defaultPaper.setQuestionGroupList(questionGroupList);
+		defaultPaper.setFullyObjective(fullyObjective);
+		return defaultPaper;
+	}
+	
+	/**
+	 * 根据question生成题单元包装器
+	 * @param question
+	 * @param score
+	 * @return
+	 */
+	private DefaultQuestionUnitWrapper buildQuesUnitWrapper(Question question,Double score){
+		DefaultQuestionUnitWrapper defaultQuestionUnitWrapper = new DefaultQuestionUnitWrapper();
+		Integer[] optionPermutation = null;
+		if(question.getQuestionType() == QuesStructType.SINGLE_ANSWER_QUESTION ||
+				question.getQuestionType() == QuesStructType.MULTIPLE_ANSWER_QUESTION){
+			int length = question.getQuesOptions().size();
+			optionPermutation = new Integer[length];
+			for(int i=0;i<length;i++){
+				optionPermutation[i] = i;
+			}
+		}
+		defaultQuestionUnitWrapper.setOptionPermutation(optionPermutation);
+		defaultQuestionUnitWrapper.setQuestionScore(score.floatValue());
+		defaultQuestionUnitWrapper.setQuestionType(getByOldType(question.getQuestionType()));
+		return defaultQuestionUnitWrapper;
+	}
+	
+	/**
+	 * 题型转换方法
+	 * @param quesStructType
+	 * @return
+	 */
+	private QuestionType getByOldType(QuesStructType quesStructType){
+		if(quesStructType == QuesStructType.BOOL_ANSWER_QUESTION){
+			return QuestionType.TRUE_OR_FALSE;
+		}
+		if(quesStructType == QuesStructType.FILL_BLANK_QUESTION){
+			return QuestionType.FILL_UP;
+		}
+		if(quesStructType == QuesStructType.MULTIPLE_ANSWER_QUESTION){
+			return QuestionType.MULTIPLE_CHOICE;
+		}
+		if(quesStructType == QuesStructType.SINGLE_ANSWER_QUESTION){
+			return QuestionType.SINGLE_CHOICE;
+		}
+		if(quesStructType == QuesStructType.TEXT_ANSWER_QUESTION){
+			return QuestionType.ESSAY;
+		}
+		return null;
+	}
+	
+
+	@Override
+	public DefaultQuestion getDefaultQuestion(Long examId, String courseCode, String groupCode, String questionId) {
+		log.debug("网考根据调卷规则中试题id:"+ questionId +"获取单个试题...");
+		long beginTime = System.currentTimeMillis();
+		Question question = quesRepo.findOne(questionId);
+		long oldQuesTime = System.currentTimeMillis();
+		log.debug("查询单个试题耗时:"+(oldQuesTime - beginTime)+"ms");
+		DefaultQuestionStructure defaultQuestionStructure = new DefaultQuestionStructure();
+		if(question.getHasAudio() == null || false == question.getHasAudio()){
+			defaultQuestionStructure.setHasAudios(false);
+		}else {
+			defaultQuestionStructure.setHasAudios(true);
+		}
+		defaultQuestionStructure.setVersion(CommonUtils.QUESTION_VERSION);
+		//生成新的题单元集合
+		List<DefaultQuestionUnit> questionUnitList = new ArrayList<DefaultQuestionUnit>();
+		if(question.getQuestionType() == QuesStructType.NESTED_ANSWER_QUESTION){
+			defaultQuestionStructure.setBody(question.getQuesBody());
+			//获取套题下面所有子题
+			List<Question> subQuesList = question.getSubQuestions();
+			if(subQuesList!=null && subQuesList.size()>0){
+				for(int i=0;i<subQuesList.size();i++){
+					Question subQuestion = subQuesList.get(i);
+					DefaultQuestionUnit defaultQuestionUnit = buildQuestionUnit(subQuestion);
+					questionUnitList.add(defaultQuestionUnit);
+				}
+			}
+		}else {
+			DefaultQuestionUnit defaultQuestionUnit = buildQuestionUnit(question);
+			questionUnitList.add(defaultQuestionUnit);
+		}
+		defaultQuestionStructure.setQuestionUnitList(questionUnitList);
+		DefaultQuestion defaultQuestion = new DefaultQuestion();
+		defaultQuestion.setId(questionId);
+		defaultQuestion.setMasterVersion(defaultQuestionStructure);
+		long newQuesTime = System.currentTimeMillis();
+		log.debug("构建一个新的试题单元耗时:"+(newQuesTime - oldQuesTime)+"ms");
+		//替换试题单元中的音频路径
+		log.debug("给新的试题替换音频标签...");
+		appendAudioFlag(defaultQuestion,String.valueOf(examId),courseCode,groupCode,question);
+		long finishTime = System.currentTimeMillis();
+		log.debug("给新的试题替换音频标签耗时:"+(finishTime- newQuesTime)+"ms");
+		return defaultQuestion;
+	}
+	
+	/**
+	 * 构建试题单元
+	 * @param question
+	 * @return
+	 */
+	private DefaultQuestionUnit buildQuestionUnit(Question question){
+		DefaultQuestionUnit defaultQuestionUnit = new DefaultQuestionUnit();
+		defaultQuestionUnit.setBody(question.getQuesBody());
+		defaultQuestionUnit.setQuestionType(getByOldType(question.getQuestionType()));
+		//如果是单选或者多选,添加选项和答案转换
+		if(question.getQuestionType() == QuesStructType.SINGLE_ANSWER_QUESTION || question.getQuestionType() == QuesStructType.MULTIPLE_ANSWER_QUESTION){
+			List<DefaultQuestionOption> defaultQuestionOptions = new ArrayList<DefaultQuestionOption>();
+			List<QuesOption> quesOptions = question.getQuesOptions();
+			if(quesOptions != null && quesOptions.size()>0){
+				for(int i=0;i<quesOptions.size();i++){
+					QuesOption quesOption = quesOptions.get(i);
+					DefaultQuestionOption defaultQuestionOption = new DefaultQuestionOption();
+					defaultQuestionOption.setBody(quesOption.getOptionBody());
+					defaultQuestionOptions.add(defaultQuestionOption);
+				}
+			}
+			defaultQuestionUnit.setQuestionOptionList(defaultQuestionOptions);
+			defaultQuestionUnit.setRightAnswer(getSelectQuestionAnswer(quesOptions));
+		}else {
+			defaultQuestionUnit.setRightAnswer(getAnswer(question));
+		}
+		return defaultQuestionUnit;
+	}
+	
+	/**
+	 * 设置单选题和多选题  答案
+	 * @param quesOptions
+	 * @return
+	 */
+	private String[] getSelectQuestionAnswer(List<QuesOption> quesOptions){
+		String[] rightAnswer = null;
+		List<String> list = new ArrayList<String>();
+		if(quesOptions != null && quesOptions.size()>0){
+			for(int i=0;i<quesOptions.size();i++){
+				QuesOption quesOption = quesOptions.get(i);
+				if(quesOption.getIsCorrect() == 1){
+					list.add(String.valueOf(i));
+				}
+			}
+			rightAnswer = list.toArray(new String[list.size()]);
+			return rightAnswer;
+		}
+		return rightAnswer;
+	}
+
+	/**
+	 * 设置试题答案
+	 * @param question
+	 * @return
+	 */
+	private String[] getAnswer(Question question){
+		String[] rightAnswer = null;
+		//判断题答案
+		if(question.getQuestionType() == QuesStructType.BOOL_ANSWER_QUESTION){
+			if(question.getQuesAnswer().equals("正确")){
+				rightAnswer = new String[1];
+				rightAnswer[0] = "true";
+				return rightAnswer;
+			}
+			if(question.getQuesAnswer().equals("错误")){
+				rightAnswer = new String[1];
+				rightAnswer[0] = "false";
+				return rightAnswer;
+			}
+		}
+		//填空题答案
+		if(question.getQuestionType() == QuesStructType.BOOL_ANSWER_QUESTION){
+			rightAnswer = question.getQuesAnswer().split("##");
+			return rightAnswer;
+		}
+		rightAnswer = new String[1];
+		rightAnswer[0] = question.getQuesAnswer();
+		return rightAnswer;
+	}
+	
+	/**
+	 * html中添加音频标签
+	 * @param defaultQuestion
+	 * @param examId
+	 * @param courseCode
+	 * @param groupCode
+	 * @param question
+	 */
+	@SuppressWarnings("unchecked")
+	private void appendAudioFlag(DefaultQuestion defaultQuestion,String examId,String courseCode,String groupCode,Question question){
+		if(question.getHasAudio() != null && question.getHasAudio() == true){
+			//1.判断questionDto是否含有音频,如果有添加音频播放次数
+			AudioTimeConfig audioTimeConfig = audioTimeConfigRepo.findOne(Example.of(new AudioTimeConfig(examId,courseCode,groupCode,question.getId())));
+			//2.1 取到题干,给a标签添加url
+			String quesBody = null;
+			if(StringUtils.isNoneBlank(defaultQuestion.getMasterVersion().getBody())){
+				quesBody = defaultQuestion.getMasterVersion().getBody();
+				defaultQuestion.getMasterVersion().setBody(buildBody(quesBody, audioTimeConfig.getPlayTime()));
+			}else {
+				DefaultQuestionUnit defaultQuestionUnit = (DefaultQuestionUnit) defaultQuestion.getMasterVersion().getQuestionUnitList().get(0);
+				quesBody = defaultQuestionUnit.getBody();
+				defaultQuestionUnit.setBody(buildBody(quesBody, audioTimeConfig.getPlayTime()));
+				if(defaultQuestionUnit.getQuestionType() == QuestionType.SINGLE_CHOICE || defaultQuestionUnit.getQuestionType() == QuestionType.MULTIPLE_CHOICE){
+					List<DefaultQuestionOption> questionOptionList = (List<DefaultQuestionOption>) defaultQuestionUnit.getQuestionOptionList();
+					if(questionOptionList != null && questionOptionList.size()>0){
+						for(int i = 0;i<questionOptionList.size();i++){
+							DefaultQuestionOption defaultQuestionOption = questionOptionList.get(i);
+							defaultQuestionOption.setBody(buildBody(defaultQuestionOption.getBody(), audioTimeConfig.getPlayTime()));
+						}
+					}
+				}
+			}
+		}
+	}
+	
+	/**
+	 * 给题目和选项添加url
+	 * @param body
+	 * @param playTime
+	 * @return
+	 */
+	public String buildBody(String body,Integer playTime){
+		String[] bodyStrings = body.split("></a>");
+		if(bodyStrings.length>1){
+			String resultBody = "";
+			for(int i = 0;i<bodyStrings.length;i++){
+				String containAStr = bodyStrings[i];
+				if(containAStr.indexOf("<a")>-1){
+					String questionAudioId = matchAudioName(containAStr, "a", "id");
+					QuestionAudio questionAudio = questionAudioService.findAudioById(questionAudioId);
+					if(questionAudio!=null){
+						String url = downloadUrl + questionAudio.getFileUrl();
+						if(playTime!=null){
+							containAStr += " question-audio url=\""+url+"\" playTime=\""+playTime+"\""+"></a>";
+						}else{
+							containAStr += " question-audio url=\""+url+"\""+"></a>";
+						}
+					}
+				}
+				resultBody+=containAStr;
+			}
+			return resultBody;
+		}else{
+			return body;
+		}
+	}
+	
+	/**
+	 * 获取一段html中某个标签的值
+	 * @param source
+	 * @param element
+	 * @param attr
+	 * @return
+	 */
+	private String matchAudioName(String source, String element, String attr) {  
+        String reg = "<" + element + "[^<>]*?\\s" + attr + "=['\"]?(.*?)['\"]?(\\s.*?)";  
+        Matcher m = Pattern.compile(reg).matcher(source);  
+        while (m.find()) {  
+            return m.group(1);
+        }  
+        return "";  
+    }
+	
+	/**
+	 * 检查所有题目是否为客观题
+	 * @param paperDetailUnits
+	 * @return
+	 */
+	private boolean checkIsAllQbjectiveQuestion(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;
+	}
+}

+ 75 - 0
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/impl/PaperDetailUnitServiceImpl.java

@@ -4,6 +4,8 @@ import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.bcel.generic.NEW;
+import org.bson.types.ObjectId;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Sort;
 import org.springframework.data.domain.Sort.Direction;
@@ -13,6 +15,11 @@ import org.springframework.data.mongodb.core.query.Criteria;
 import org.springframework.data.mongodb.core.query.Query;
 import org.springframework.stereotype.Service;
 
+import com.mongodb.BasicDBList;
+import com.mongodb.BasicDBObject;
+import com.mongodb.DBCursor;
+import com.mongodb.DBObject;
+
 import cn.com.qmth.examcloud.core.questions.base.question.enums.QuesStructType;
 import cn.com.qmth.examcloud.commons.web.security.bean.User;
 import cn.com.qmth.examcloud.core.questions.dao.PaperDetailUnitRepo;
@@ -210,5 +217,73 @@ public class PaperDetailUnitServiceImpl implements PaperDetailUnitService{
 		List<PaperDetailUnit> paperDetailUnits = this.mongoTemplate.find(query, PaperDetailUnit.class);
 		return paperDetailUnits;
 	}
+
+	@Override
+	public List<PaperDetailUnit> findByDDQuestionsAndPaperType(List<String> ids, PaperType paperType,List<Question> questionList) {
+		List<ObjectId> objectIds = new ArrayList<ObjectId>();
+		for(String id:ids){
+			objectIds.add(new ObjectId(id));
+		}
+		Query query=new Query();
+		query.addCriteria(Criteria.where("question.$id").in(objectIds));
+		query.addCriteria(Criteria.where("paperType").is("IMPORT"));
+		List<PaperDetailUnit> paperDetailUnits = mongoTemplate.find(query, PaperDetailUnit.class);
+		return paperDetailUnits;
+	}
+
+	@Override
+	public List<PaperDetailUnit> testFind(List<String> ids,PaperType paperType, List<Question> questionList) {
+		//第一种查询,quesion.id  id
+		DBObject query1 = new BasicDBObject();
+		BasicDBList values = new BasicDBList();
+		for(String id:ids){
+			values.add(id);
+		}
+		query1.put("quesion.id", new BasicDBObject("$in", values));
+		DBCursor dbCursor = mongoTemplate.getCollection("paperDetailUnit").find(query1);
+		while (dbCursor.hasNext()){
+			DBObject object=dbCursor.next();
+			System.out.println("打印游标---------------"+object);
+		}
+		
+		//第二种查询,quesion.$id  id
+		DBObject query2 = new BasicDBObject();
+		BasicDBList values2 = new BasicDBList();
+		for(String id:ids){
+			values2.add(id);
+		}
+		query1.put("quesion.$id", new BasicDBObject("$in", values2));
+		DBCursor dbCursor2 = mongoTemplate.getCollection("paperDetailUnit").find(query1);
+		while (dbCursor2.hasNext()){
+			DBObject object=dbCursor2.next();
+			System.out.println("打印游标2---------------"+object);
+		}
+		
+		//第三种查询,quesion.$id  ObjectId
+		DBObject query3 = new BasicDBObject();
+		BasicDBList values3 = new BasicDBList();
+		for(String id:ids){
+			values3.add(new ObjectId(id));
+		}
+		query1.put("quesion.$id", new BasicDBObject("$in", values3));
+		DBCursor dbCursor3 = mongoTemplate.getCollection("paperDetailUnit").find(query1);
+		while (dbCursor3.hasNext()){
+			DBObject object=dbCursor3.next();
+			System.out.println("打印游标3---------------"+object);
+		}
+		return null;
+	}
+
+	@Override
+	public List<PaperDetailUnit> findByPaperIds(List<String> ids) {
+		List<ObjectId> objectIds = new ArrayList<ObjectId>();
+		for(String id:ids){
+			objectIds.add(new ObjectId(id));
+		}
+		Query query=new Query();
+		query.addCriteria(Criteria.where("paper.$id").in(objectIds));
+		List<PaperDetailUnit> paperDetailUnits = mongoTemplate.find(query, PaperDetailUnit.class);
+		return paperDetailUnits;
+	}
 }
 

+ 5 - 1
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/impl/PaperServiceImpl.java

@@ -856,7 +856,11 @@ public class PaperServiceImpl implements PaperService{
         PaperDetail paperDetail = paperDetailRepo.findOne(paperDetailId);
         PaperDetailUnit paperDetailUnit = new PaperDetailUnit(paper,paperDetail,question);
         PaperDetailUnit paperDetailUnit2 = paperDetailUnitService.findTopOrderByNumber(paperDetail,"DESC");
-        paperDetailUnit.setNumber(paperDetailUnit2.getNumber());//设置number为大题的最大题号
+        if(paperDetailUnit2 == null){
+        	paperDetailUnit.setNumber(1);
+        }else {
+        	 paperDetailUnit.setNumber(paperDetailUnit2.getNumber());//设置number为大题的最大题号
+		}
         paperDetailUnitRepo.save(paperDetailUnit);
         formatPaper(paper,user);
         return paper;

+ 382 - 0
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/temp/DdExcelService.java

@@ -0,0 +1,382 @@
+package cn.com.qmth.examcloud.core.questions.service.temp;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import cn.com.qmth.examcloud.core.questions.base.enums.PaperType;
+import cn.com.qmth.examcloud.core.questions.base.question.enums.QuesStructType;
+import cn.com.qmth.examcloud.core.questions.dao.CourseRepo;
+import cn.com.qmth.examcloud.core.questions.dao.PaperDetailUnitRepo;
+import cn.com.qmth.examcloud.core.questions.dao.PaperRepo;
+import cn.com.qmth.examcloud.core.questions.dao.QuesTypeNameRepo;
+import cn.com.qmth.examcloud.core.questions.dao.entity.Course;
+import cn.com.qmth.examcloud.core.questions.dao.entity.Paper;
+import cn.com.qmth.examcloud.core.questions.dao.entity.PaperDetailUnit;
+import cn.com.qmth.examcloud.core.questions.dao.entity.QuesTypeName;
+import cn.com.qmth.examcloud.core.questions.dao.entity.Question;
+import cn.com.qmth.examcloud.core.questions.dao.QuesRepo;
+import cn.com.qmth.examcloud.core.questions.service.PaperDetailUnitService;
+import cn.com.qmth.examcloud.core.questions.service.temp.vo.DdExcelDto;
+import cn.com.qmth.examcloud.question.core.question.QuestionType;
+
+@Service("ddExcelService")
+public class DdExcelService {
+
+	@Autowired
+    private CourseRepo courseRepo;
+	
+	@Autowired
+	private QuesRepo quesRepo;
+	
+	@Autowired
+    PaperDetailUnitService paperDetailUnitService;
+	
+	@Autowired
+    PaperDetailUnitRepo paperDetailUnitRepo;
+	
+	@Autowired
+	PaperRepo paperRepo;
+
+	@Autowired
+	private QuesTypeNameRepo quesTypeRepo;
+
+	 
+	public void insertQueryName(String orgId){
+		//查询所有课程
+		long startCourseTime = System.currentTimeMillis();
+		List<Course> courses = courseRepo.findByOrgId(orgId);
+		long endCourseTime = System.currentTimeMillis();
+		System.out.println("查询课程耗时:"+ (endCourseTime - startCourseTime) +"ms");
+		if(courses != null && courses.size()>0){
+			int i = 1;
+			int j = 1;
+			for(Course course : courses){
+				//根据课程查询试卷
+				long startPaperTime = System.currentTimeMillis();
+				List<Paper> papers = paperRepo.findByCourseNoAndOrgId(course.getCode(), orgId);
+				long endPaperTime = System.currentTimeMillis();
+				System.out.println("查询第"+i+"个课程下所有试卷耗时耗时:"+ (endPaperTime - startPaperTime) +"ms,课程代码为:"+course.getCode());
+				if(papers != null && papers.size()>0){
+					//生成所有试卷的试题集合
+					List<PaperDetailUnit> allUnits = new ArrayList<PaperDetailUnit>();
+					for(Paper paper:papers){
+						//根据试卷查询paperDetailUnits
+						long startUnitTime = System.currentTimeMillis();
+						List<PaperDetailUnit> paperDetailUnits = paperDetailUnitRepo.findByPaper(paper);
+						long endUnitTime = System.currentTimeMillis();
+						System.out.println("查询"+paper.getName()+"个试卷下所有试题耗时耗时:"+ (endUnitTime - startUnitTime) +"ms");
+						if(paperDetailUnits != null && paperDetailUnits.size()>0){
+							for(PaperDetailUnit unit:paperDetailUnits){
+								allUnits.add(unit);
+							}
+						}
+					}
+					System.out.println("开始生成对象...总题数量:"+allUnits.size());
+					//生成需要保存的大题来源集合
+					List<QuesTypeName> quesTypeNames = new ArrayList<QuesTypeName>();
+					Map<QuesStructType, List<String>> map = buildQuesTypeName(allUnits);
+					for(Map.Entry<QuesStructType, List<String>> entry : map.entrySet()){
+						QuesTypeName quesTypeName = new QuesTypeName();
+		                quesTypeName.setOrgId(orgId);
+		                quesTypeName.setCourseNo(course.getCode());
+		                quesTypeName.setQuestionType(entry.getKey());
+		                quesTypeName.setQuesNames(entry.getValue());
+		                quesTypeNames.add(quesTypeName);
+		                System.out.println("生成完第"+j+"个对象");
+		                j++;
+					}
+					long endTime = System.currentTimeMillis();
+					System.out.println("所有试题耗时耗时:"+ (endTime - endPaperTime) +"ms");
+					quesTypeRepo.save(quesTypeNames);
+					long ends = System.currentTimeMillis();
+					System.out.println("第"+i+"个课程保存所有来源大题耗时:"+ (ends - endTime) +"ms");
+				}
+				i++;
+			}
+			System.out.println("对象生成完");
+		}
+	}
+	
+	//quesTypeRepo.save(quesTypeNames);
+	public Map<QuesStructType, List<String>> buildQuesTypeName(List<PaperDetailUnit> paperDetailUnits){
+		Map<QuesStructType, List<String>> map = new HashMap<QuesStructType, List<String>>();
+		for(PaperDetailUnit paperDetailUnit:paperDetailUnits){
+			String name = paperDetailUnit.getPaperDetail().getName();
+			QuesStructType questionType = paperDetailUnit.getQuestion().getQuestionType();
+			List<String> names = map.get(questionType);
+			if(names == null){
+				List<String> nameList = new ArrayList<String>();
+				nameList.add(name);
+				map.put(questionType, nameList);
+			}else {
+				if(names.contains(name)){
+					continue;
+				}else {
+					names.add(name);
+					map.put(questionType, names);
+				}
+			}
+		}
+		return map;
+	}
+	
+	public void exporExcel(String orgId) throws Exception{
+		//导出Excel集合
+		List<DdExcelDto> ddExcelDtos = new ArrayList<DdExcelDto>();
+		//查询所有课程
+		long startCourseTime = System.currentTimeMillis();
+		List<Course> courses = courseRepo.findByOrgId(orgId);
+		long endCourseTime = System.currentTimeMillis();
+		System.out.println("查询课程耗时:"+ (endCourseTime - startCourseTime) +"ms");
+		if(courses != null && courses.size()>0){
+			int i = 0;
+			for(Course course : courses){
+				//查询该课程下的所有question
+				long startQuestionTime = System.currentTimeMillis();
+				List<Question> questions = quesRepo.findByCourseAndOrgId(course, orgId);
+				long endQuestionTime = System.currentTimeMillis();
+				System.out.println("查询第"+ i + "个课程试题耗时:"+ (endQuestionTime - startQuestionTime) +"ms");
+				List<String> oIds = new ArrayList<String>();
+		    	for (Question question : questions) {
+		    		oIds.add(question.getId());
+		    	}
+				//根据question查询paperDetailUnit
+		    	long startUnitTime = System.currentTimeMillis();
+				List<PaperDetailUnit> oDetailUnits = paperDetailUnitService.findByDDQuestionsAndPaperType(oIds, PaperType.IMPORT,questions);
+				long endUnitTime = System.currentTimeMillis();
+				System.out.println("查询第"+ i + "个课程试题耗时:"+ (endUnitTime - startUnitTime) +"ms");
+				Map<String, Long> map = new HashMap<String, Long>();
+				if(oDetailUnits != null && oDetailUnits.size()>0){
+					for(PaperDetailUnit unit:oDetailUnits){
+						//大题名称
+						String quesName = unit.getPaperDetail().getName();
+						if(map.get(quesName) == null){
+							map.put(quesName, 1L);
+						}else {
+							Long number = map.get(quesName);
+							number++;
+							map.put(quesName, number);
+						}
+					}
+				}
+				DdExcelDto ddExcelDto = new DdExcelDto(course.getName(), course.getCode(), map);
+				ddExcelDtos.add(ddExcelDto);
+				System.out.println("已经处理完:" + i + "个课程...");
+				i++;
+			}
+		}
+		Map<String, Long> otherMap = new HashMap<String, Long>();
+		//生成Excel对象
+		File ddExcelFile = new File("H:\\ddExcelDto.xlsx");
+		Workbook workBook = new XSSFWorkbook(ddExcelFile);
+		//获取第一个工作页
+        Sheet sheet = workBook.getSheetAt(0);
+        System.out.println(sheet.getSheetName());
+        //向Excle中写入数据,从第2行开始
+        for(int i = 0;i<ddExcelDtos.size();i++){
+        	//创建一行:从第1行开始,跳过表头
+            Row row = sheet.createRow(i+1);
+            DdExcelDto ddExcelDto = ddExcelDtos.get(i);
+            //每列赋值
+            row.createCell(0).setCellValue(ddExcelDto.getCourseName());
+            row.createCell(1).setCellValue(ddExcelDto.getCourseCode());
+            if(ddExcelDto.getMap() != null && ddExcelDto.getMap().size()>0){
+            	if(ddExcelDto.getMap().get("单选题") == null){
+            		row.createCell(2).setCellValue(0);
+            	}else {
+            		row.createCell(2).setCellValue(ddExcelDto.getMap().get("单选题"));
+				}
+            	
+            	if(ddExcelDto.getMap().get("多选题") == null){
+            		row.createCell(3).setCellValue(0);
+            	}else {
+            		row.createCell(3).setCellValue(ddExcelDto.getMap().get("多选题"));
+				}
+            	
+            	if(ddExcelDto.getMap().get("填空题") == null){
+            		row.createCell(4).setCellValue(0);
+            	}else {
+            		row.createCell(4).setCellValue(ddExcelDto.getMap().get("填空题"));
+				}
+            	
+            	if(ddExcelDto.getMap().get("选词填空") == null){
+            		row.createCell(5).setCellValue(0);
+            	}else {
+            		row.createCell(5).setCellValue(ddExcelDto.getMap().get("选词填空"));
+				}
+            	
+            	if(ddExcelDto.getMap().get("完型填空") == null){
+            		row.createCell(6).setCellValue(0);
+            	}else {
+            		row.createCell(6).setCellValue(ddExcelDto.getMap().get("完型填空"));
+				}
+            	
+            	if(ddExcelDto.getMap().get("判断题") == null){
+            		row.createCell(7).setCellValue(0);
+            	}else {
+            		row.createCell(7).setCellValue(ddExcelDto.getMap().get("判断题"));
+				}
+            	
+            	if(ddExcelDto.getMap().get("阅读理解") == null){
+            		row.createCell(8).setCellValue(0);
+            	}else {
+            		row.createCell(8).setCellValue(ddExcelDto.getMap().get("阅读理解"));
+				}
+            	
+            	if(ddExcelDto.getMap().get("问答题") == null){
+            		row.createCell(9).setCellValue(0);
+            	}else {
+            		row.createCell(9).setCellValue(ddExcelDto.getMap().get("问答题"));
+				}
+            	
+            	if(ddExcelDto.getMap().get("名词解释") == null){
+            		row.createCell(10).setCellValue(0);
+            	}else {
+            		row.createCell(10).setCellValue(ddExcelDto.getMap().get("名词解释"));
+				}
+            	
+            	//额外大题名称
+            	if(ddExcelDto.getMap().get("案例分析") == null){
+            		row.createCell(11).setCellValue(0);
+            	}else {
+            		row.createCell(11).setCellValue(ddExcelDto.getMap().get("案例分析"));
+				}
+            	
+            	if(ddExcelDto.getMap().get("作文题") == null){
+            		row.createCell(12).setCellValue(0);
+            	}else {
+            		row.createCell(12).setCellValue(ddExcelDto.getMap().get("作文题"));
+				}
+            	
+            	if(ddExcelDto.getMap().get("交际英语") == null){
+            		row.createCell(13).setCellValue(0);
+            	}else {
+            		row.createCell(13).setCellValue(ddExcelDto.getMap().get("交际英语"));
+				}
+            	
+            	if(ddExcelDto.getMap().get("简答题") == null){
+            		row.createCell(14).setCellValue(0);
+            	}else {
+            		row.createCell(14).setCellValue(ddExcelDto.getMap().get("简答题"));
+				}
+            	
+            	if(ddExcelDto.getMap().get("一、单选题") == null){
+            		row.createCell(15).setCellValue(0);
+            	}else {
+            		row.createCell(15).setCellValue(ddExcelDto.getMap().get("一、单选题"));
+				}
+            	
+            	if(ddExcelDto.getMap().get("名称解释") == null){
+            		row.createCell(16).setCellValue(0);
+            	}else {
+            		row.createCell(16).setCellValue(ddExcelDto.getMap().get("名称解释"));
+				}
+            	
+            	if(ddExcelDto.getMap().get("综合题") == null){
+            		row.createCell(17).setCellValue(0);
+            	}else {
+            		row.createCell(17).setCellValue(ddExcelDto.getMap().get("综合题"));
+				}
+            	
+            	if(ddExcelDto.getMap().get("设计题") == null){
+            		row.createCell(18).setCellValue(0);
+            	}else {
+            		row.createCell(18).setCellValue(ddExcelDto.getMap().get("设计题"));
+				}
+            	
+            	if(ddExcelDto.getMap().get("二、名词解释") == null){
+            		row.createCell(19).setCellValue(0);
+            	}else {
+            		row.createCell(19).setCellValue(ddExcelDto.getMap().get("二、名词解释"));
+				}
+            	
+            	if(ddExcelDto.getMap().get("分析题") == null){
+            		row.createCell(20).setCellValue(0);
+            	}else {
+            		row.createCell(20).setCellValue(ddExcelDto.getMap().get("分析题"));
+				}
+            	
+            	if(ddExcelDto.getMap().get("英汉翻译") == null){
+            		row.createCell(21).setCellValue(0);
+            	}else {
+            		row.createCell(21).setCellValue(ddExcelDto.getMap().get("英汉翻译"));
+				}
+            	
+            	if(ddExcelDto.getMap().get("作文") == null){
+            		row.createCell(22).setCellValue(0);
+            	}else {
+            		row.createCell(22).setCellValue(ddExcelDto.getMap().get("作文"));
+				}
+            	
+            	if(ddExcelDto.getMap().get("二、计算题") == null){
+            		row.createCell(23).setCellValue(0);
+            	}else {
+            		row.createCell(23).setCellValue(ddExcelDto.getMap().get("二、计算题"));
+				}
+            	
+            	if(ddExcelDto.getMap().get("作图题") == null){
+            		row.createCell(24).setCellValue(0);
+            	}else {
+            		row.createCell(24).setCellValue(ddExcelDto.getMap().get("作图题"));
+				}
+
+            	if(ddExcelDto.getMap().get("论述题") == null){
+            		row.createCell(25).setCellValue(0);
+            	}else {
+            		row.createCell(25).setCellValue(ddExcelDto.getMap().get("论述题"));
+				}
+
+            	if(ddExcelDto.getMap().get("三、计算题") == null){
+            		row.createCell(26).setCellValue(0);
+            	}else {
+            		row.createCell(26).setCellValue(ddExcelDto.getMap().get("三、计算题"));
+				}
+            	
+            	if(ddExcelDto.getMap().get("计算题") == null){
+            		row.createCell(27).setCellValue(0);
+            	}else {
+            		row.createCell(27).setCellValue(ddExcelDto.getMap().get("计算题"));
+				}
+            	
+            	if(ddExcelDto.getMap().get("算法设计题") == null){
+            		row.createCell(28).setCellValue(0);
+            	}else {
+            		row.createCell(28).setCellValue(ddExcelDto.getMap().get("算法设计题"));
+				}
+            	
+            	if(ddExcelDto.getMap().get("翻译题") == null){
+            		row.createCell(29).setCellValue(0);
+            	}else {
+            		row.createCell(29).setCellValue(ddExcelDto.getMap().get("翻译题"));
+				}
+                
+            }else {
+				System.out.println("kong"+ddExcelDto.getCourseName());
+			}
+        }
+        File file = new File("H:\\ddExcelDtoNew.xlsx");
+        OutputStream out = new FileOutputStream(file);
+        workBook.write(out);
+        out.close();
+        System.out.println("结束...");
+        System.out.println(otherMap);
+	}
+	
+	public static void main(String[] args){
+		File ddExcelFile = new File("H:\\ddExcelDto.xlsx");
+		System.out.println(ddExcelFile);
+	}
+	
+}

+ 63 - 0
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/temp/vo/DdExcelDto.java

@@ -0,0 +1,63 @@
+package cn.com.qmth.examcloud.core.questions.service.temp.vo;
+
+import java.util.Map;
+
+/**
+ * @author 		weiwenhai
+ * @date 		2018.8.19
+ * @company		qmth
+ * @describle	地大各个课程下各题型统计Excel
+ */
+public class DdExcelDto {
+
+	/**
+	 * 课程名称
+	 */
+	private String courseName;
+	
+	/**
+	 * 课程代码
+	 */
+	private String courseCode;
+	
+	/**
+	 * key:大题名称
+	 * value:数量
+	 */
+	private Map<String, Long> map;
+	
+	public DdExcelDto(){
+		
+	}
+	
+	public DdExcelDto(String courseName,String courseCode,Map<String, Long> map){
+		this.courseName = courseName;
+		this.courseCode = courseCode;
+		this.map = map;
+	}
+
+	public String getCourseName() {
+		return courseName;
+	}
+
+	public void setCourseName(String courseName) {
+		this.courseName = courseName;
+	}
+
+	public String getCourseCode() {
+		return courseCode;
+	}
+
+	public void setCourseCode(String courseCode) {
+		this.courseCode = courseCode;
+	}
+
+	public Map<String, Long> getMap() {
+		return map;
+	}
+
+	public void setMap(Map<String, Long> map) {
+		this.map = map;
+	}
+	
+}

+ 3 - 3
examcloud-core-questions-starter/src/main/resources/application-dev.properties

@@ -1,9 +1,9 @@
-spring.data.mongodb.uri=mongodb://root:Qmth87863577@127.0.0.1:6600/comm-ques-bank?authSource=admin&authMechanism=SCRAM-SHA-1
-#spring.data.mongodb.uri=mongodb://192.168.10.30:27017/comm-ques-bank
+#spring.data.mongodb.uri=mongodb://root:Qmth87863577@127.0.0.1:6600/comm-ques-bank?authSource=admin&authMechanism=SCRAM-SHA-1
+spring.data.mongodb.uri=mongodb://192.168.10.30:27017/comm-ques-bank
 spring.data.mongodb.grid-fs-database=comm-ques-bank
 spring.data.mongodb.database=comm-ques-bank
 eureka.client.serviceUrl.defaultZone=http://192.168.10.30:1111/eureka/
-spring.application.name=ExamCloud-service-question
+spring.application.name=MASTER-ExamCloud-service-question
 
 spring.redis.host=192.168.10.30
 spring.redis.port=6379

+ 5 - 3
examcloud-core-questions-starter/src/main/resources/application.properties

@@ -1,7 +1,7 @@
 spring.profiles.active=dev
-server.port=8008
+server.port=9008
 logging.config=classpath:logback-spring.xml
-spring.application.name=ExamCloud-service-question
+spring.application.name=MASTER-ExamCloud-service-question
 hystrix.command.default.execution.timeout.enabled=false
 api_cqb=/api/ecs_ques
 app.api.core=/api/ecs_core
@@ -13,4 +13,6 @@ hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 600000
 ribbon.ReadTimeout=800000
 ribbon.ConnectTimeout=800000
 spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
-spring.jackson.time-zone=GMT+8
+spring.jackson.time-zone=GMT+8
+
+$rmp.cloud.questions=/api/core/questions/

+ 1 - 1
examcloud-core-questions-starter/src/main/resources/logback-spring.xml

@@ -49,7 +49,7 @@
 	<logger name="org.hibernate.type" level="DEBUG" />
 	<logger name="org.hibernate.engine.QueryParameters" level="DEBUG" />
 	<logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" />
-	<!--<logger name="org.springframework.data.mongodb" level="DEBUG" />-->
+	<!-- <logger name="org.springframework.data.mongodb" level="DEBUG" /> -->
 	<logger name="org.docx4j" level="ERROR" />
 
 	<root level="INFO">

+ 15 - 1
examcloud-core-questions-starter/src/test/java/cn/com/qmth/examcloud/core/questions/starter/DdCollegeUtilTest.java

@@ -16,6 +16,7 @@ import cn.com.qmth.examcloud.commons.base.logging.ExamCloudLogFactory;
 import cn.com.qmth.examcloud.core.questions.dao.PaperDetailUnitRepo;
 import cn.com.qmth.examcloud.core.questions.dao.entity.Paper;
 import cn.com.qmth.examcloud.core.questions.dao.entity.PaperDetailUnit;
+import cn.com.qmth.examcloud.core.questions.service.temp.DdExcelService;
 import cn.com.qmth.examcloud.core.questions.service.temp.vo.TestOption;
 import cn.com.qmth.examcloud.core.questions.service.temp.vo.TestPaper;
 import cn.com.qmth.examcloud.core.questions.service.temp.vo.TestQuestion;
@@ -73,8 +74,11 @@ public class DdCollegeUtilTest {
 	 
 	 @Autowired
 	 PaperDetailUnitRepo paperDetailUnitRepo;
+	 
+	 @Autowired
+	 DdExcelService ddExcelService;
 
-	 @Test
+	/* @Test
 	 public void updatePaperType(){
 		 System.out.println("开始更新paperType...");
 		 Query query = new Query();
@@ -90,6 +94,16 @@ public class DdCollegeUtilTest {
 			 paperDetailUnitRepo.save(pduList);
 			 System.out.println("更新完..."+ (i+1)*1000 + "记录");
 		 }
+	 }*/
+	 
+	 @Test
+	 public void excelTest(){
+		 try {
+			//ddExcelService.exporExcel("1627");
+			 ddExcelService.insertQueryName("1627");
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
 	 }
 	
 }