Просмотр исходного кода

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

Conflicts:
cqb-comm-utils/pom.xml
cqb-paper/src/main/java/com/qmth/cqb/paper/service/ImportPaperService.java
cqb-paper/src/main/java/com/qmth/cqb/paper/web/ImportPaperController.java

gaoxing 8 лет назад
Родитель
Сommit
2d42e76dad
22 измененных файлов с 1872 добавлено и 1076 удалено
  1. 18 4
      .gitignore
  2. 69 69
      cqb-base/src/main/java/com/qmth/cqb/base/model/Setting.java
  3. 61 61
      cqb-base/src/main/java/com/qmth/cqb/base/service/CourseService.java
  4. 45 45
      cqb-base/src/main/java/com/qmth/cqb/base/service/SettingService.java
  5. 1 1
      cqb-comm-utils/pom.xml
  6. 1 2
      cqb-paper/src/main/java/com/qmth/cqb/paper/dao/ExtractConfigRepo.java
  7. 35 25
      cqb-paper/src/main/java/com/qmth/cqb/paper/model/ExamPaper.java
  8. 181 15
      cqb-paper/src/main/java/com/qmth/cqb/paper/model/ExtractConfig.java
  9. 17 0
      cqb-paper/src/main/java/com/qmth/cqb/paper/service/ExamPaperService.java
  10. 30 0
      cqb-paper/src/main/java/com/qmth/cqb/paper/service/ExamPaperServiceImpl.java
  11. 45 0
      cqb-paper/src/main/java/com/qmth/cqb/paper/service/ExtractConfigService.java
  12. 256 0
      cqb-paper/src/main/java/com/qmth/cqb/paper/service/ExtractConfigServiceImpl.java
  13. 9 14
      cqb-paper/src/main/java/com/qmth/cqb/paper/service/ImportPaperService.java
  14. 550 550
      cqb-paper/src/main/java/com/qmth/cqb/paper/service/PaperService.java
  15. 64 0
      cqb-paper/src/main/java/com/qmth/cqb/paper/web/ExamPaperController.java
  16. 87 0
      cqb-paper/src/main/java/com/qmth/cqb/paper/web/ExtractConfigController.java
  17. 14 15
      cqb-paper/src/main/java/com/qmth/cqb/paper/web/ImportPaperController.java
  18. 1 1
      cqb-starter/src/main/resources/application-dev.properties
  19. 2 2
      cqb-starter/src/main/resources/application-test.properties
  20. 17 17
      cqb-starter/src/main/resources/log4j2.xml
  21. 255 255
      cqb-starter/src/test/java/com/qmth/cqb/AppTest.java
  22. 114 0
      cqb-starter/src/test/java/com/qmth/cqb/ExtractConfigServiceTest.java

+ 18 - 4
.gitignore

@@ -1,5 +1,19 @@
-.idea
+*.class
+
+# Proguard folder generated by ide
+.project
+.classpath
+.settings
+target/
+.idea/
 *.iml
-out
-gen
-*target
+
+# Log Files
+*.log
+*.class
+
+
+# Package Files #
+*.jar
+*.war
+*.ear

+ 69 - 69
cqb-base/src/main/java/com/qmth/cqb/base/model/Setting.java

@@ -1,69 +1,69 @@
-package com.qmth.cqb.base.model;
-
-import com.qmth.cqb.utils.enums.Switch;
-import org.springframework.data.annotation.Id;
-
-import java.io.Serializable;
-
-/**
- * Created by songyue on 17/3/27.
- */
-public class Setting implements Serializable {
-
-    private static final long serialVersionUID = 8476640757849637183L;
-
-    @Id
-    private String id;
-
-    private String code;
-
-    private String name;
-
-    private Switch status;
-
-    private String params;
-
-    public static long getSerialVersionUID() {
-        return serialVersionUID;
-    }
-
-    public String getId() {
-        return id;
-    }
-
-    public void setId(String id) {
-        this.id = id;
-    }
-
-    public String getCode() {
-        return code;
-    }
-
-    public void setCode(String code) {
-        this.code = code;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public Switch getStatus() {
-        return status;
-    }
-
-    public void setStatus(Switch status) {
-        this.status = status;
-    }
-
-    public String getParams() {
-        return params;
-    }
-
-    public void setParams(String params) {
-        this.params = params;
-    }
-}
+package com.qmth.cqb.base.model;
+
+import com.qmth.cqb.utils.enums.Switch;
+import org.springframework.data.annotation.Id;
+
+import java.io.Serializable;
+
+/**
+ * Created by songyue on 17/3/27.
+ */
+public class Setting implements Serializable {
+
+    private static final long serialVersionUID = 8476640757849637183L;
+
+    @Id
+    private String id;
+
+    private String code;
+
+    private String name;
+
+    private Switch status;
+
+    private String params;
+
+    public static long getSerialVersionUID() {
+        return serialVersionUID;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Switch getStatus() {
+        return status;
+    }
+
+    public void setStatus(Switch status) {
+        this.status = status;
+    }
+
+    public String getParams() {
+        return params;
+    }
+
+    public void setParams(String params) {
+        this.params = params;
+    }
+}

+ 61 - 61
cqb-base/src/main/java/com/qmth/cqb/base/service/CourseService.java

@@ -1,61 +1,61 @@
-package com.qmth.cqb.base.service;
-
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.domain.Example;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.PageRequest;
-import org.springframework.data.mongodb.core.MongoTemplate;
-import org.springframework.data.mongodb.core.query.Criteria;
-import org.springframework.data.mongodb.core.query.Query;
-import org.springframework.stereotype.Service;
-
-import com.qmth.cqb.base.dao.CourseRepo;
-import com.qmth.cqb.base.model.Course;
-/**
- * Created by songyue on 16/12/28.
- */
-@Service
-public class CourseService {
-	
-	@Autowired
-	CourseRepo courseRepo;
-	
-    @Autowired
-    MongoTemplate mongoTemplate;
-    
-    /**
-     * 查询所有课程
-     * @param searchCondition
-     * @param curPage
-     * @param pageSize
-     * @return
-     */
-    public Page<Course> findAll(Course searchCondition, int curPage, int pageSize){
-        return courseRepo.findAll(Example.of(searchCondition),
-                new PageRequest(curPage - 1,pageSize));
-    }
-
-
-    /**
-     * 根据课程名称或者课程No查找课程
-     * @param 
-     * @return
-     */
-    public List<Course> findCoursesByKeyword(String keyword){
-        List<Course> courselist = new ArrayList<Course>();
-        if(StringUtils.isEmpty(keyword)){
-            return courselist;
-        }else{
-            Criteria likeNo = Criteria.where("courseNo").regex(keyword);//模糊匹配相当于SQL中“%Keyword%”
-            Criteria likeName = Criteria.where("courseName").regex(keyword);
-            Query query = new Query(new Criteria().orOperator(likeName,likeNo));
-            courselist = mongoTemplate.find(query, Course.class);
-            return courselist;
-        }
-    }
-}
+package com.qmth.cqb.base.service;
+
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Example;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Service;
+
+import com.qmth.cqb.base.dao.CourseRepo;
+import com.qmth.cqb.base.model.Course;
+/**
+ * Created by songyue on 16/12/28.
+ */
+@Service
+public class CourseService {
+	
+	@Autowired
+	CourseRepo courseRepo;
+	
+    @Autowired
+    MongoTemplate mongoTemplate;
+    
+    /**
+     * 查询所有课程
+     * @param searchCondition
+     * @param curPage
+     * @param pageSize
+     * @return
+     */
+    public Page<Course> findAll(Course searchCondition, int curPage, int pageSize){
+        return courseRepo.findAll(Example.of(searchCondition),
+                new PageRequest(curPage - 1,pageSize));
+    }
+
+
+    /**
+     * 根据课程名称或者课程No查找课程
+     * @param 
+     * @return
+     */
+    public List<Course> findCoursesByKeyword(String keyword){
+        List<Course> courselist = new ArrayList<Course>();
+        if(StringUtils.isEmpty(keyword)){
+            return courselist;
+        }else{
+            Criteria likeNo = Criteria.where("courseNo").regex(keyword);//模糊匹配相当于SQL中“%Keyword%”
+            Criteria likeName = Criteria.where("courseName").regex(keyword);
+            Query query = new Query(new Criteria().orOperator(likeName,likeNo));
+            courselist = mongoTemplate.find(query, Course.class);
+            return courselist;
+        }
+    }
+}

+ 45 - 45
cqb-base/src/main/java/com/qmth/cqb/base/service/SettingService.java

@@ -1,45 +1,45 @@
-package com.qmth.cqb.base.service;
-
-
-import com.qmth.cqb.base.dao.CourseRepo;
-import com.qmth.cqb.base.dao.SettingRepo;
-import com.qmth.cqb.base.model.Course;
-import com.qmth.cqb.base.model.Setting;
-import com.qmth.cqb.utils.enums.Switch;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.domain.Example;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.PageRequest;
-import org.springframework.data.mongodb.core.MongoTemplate;
-import org.springframework.data.mongodb.core.query.Criteria;
-import org.springframework.data.mongodb.core.query.Query;
-import org.springframework.stereotype.Service;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Created by songyue on 16/12/28.
- */
-@Service
-public class SettingService {
-	
-	@Autowired
-    SettingRepo settingRepo;
-	
-    public void initData(){
-        if(settingRepo.count() == 0){
-            Setting importSetting = new Setting();
-            Setting genSetting = new Setting();
-            importSetting.setCode("import");
-            importSetting.setName("试题入库审核");
-            importSetting.setStatus(Switch.ON);
-            genSetting.setCode("gen");
-            genSetting.setName("试卷组成审核");
-            genSetting.setStatus(Switch.ON);
-            settingRepo.save(importSetting);
-            settingRepo.save(genSetting);
-        }
-    }
-}
+package com.qmth.cqb.base.service;
+
+
+import com.qmth.cqb.base.dao.CourseRepo;
+import com.qmth.cqb.base.dao.SettingRepo;
+import com.qmth.cqb.base.model.Course;
+import com.qmth.cqb.base.model.Setting;
+import com.qmth.cqb.utils.enums.Switch;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Example;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by songyue on 16/12/28.
+ */
+@Service
+public class SettingService {
+	
+	@Autowired
+    SettingRepo settingRepo;
+	
+    public void initData(){
+        if(settingRepo.count() == 0){
+            Setting importSetting = new Setting();
+            Setting genSetting = new Setting();
+            importSetting.setCode("import");
+            importSetting.setName("试题入库审核");
+            importSetting.setStatus(Switch.ON);
+            genSetting.setCode("gen");
+            genSetting.setName("试卷组成审核");
+            genSetting.setStatus(Switch.ON);
+            settingRepo.save(importSetting);
+            settingRepo.save(genSetting);
+        }
+    }
+}

+ 1 - 1
cqb-comm-utils/pom.xml

@@ -211,4 +211,4 @@
             <version>5.1.1</version>
         </dependency>
     </dependencies>
-</project>
+</project>

+ 1 - 2
cqb-paper/src/main/java/com/qmth/cqb/paper/dao/ExtractConfigRepo.java

@@ -3,9 +3,8 @@ package com.qmth.cqb.paper.dao;
 import org.springframework.data.mongodb.repository.MongoRepository;
 import org.springframework.data.repository.query.QueryByExampleExecutor;
 
-import com.qmth.cqb.paper.model.ExamPaper;
 import com.qmth.cqb.paper.model.ExtractConfig;
 
-public interface ExtractConfigRepo extends MongoRepository<ExtractConfig, Long>,QueryByExampleExecutor<ExtractConfig> {
+public interface ExtractConfigRepo extends MongoRepository<ExtractConfig, String>,QueryByExampleExecutor<ExtractConfig> {
 
 }

+ 35 - 25
cqb-paper/src/main/java/com/qmth/cqb/paper/model/ExamPaper.java

@@ -3,7 +3,7 @@ package com.qmth.cqb.paper.model;
 import java.io.Serializable;
 
 import org.springframework.data.annotation.Id;
-import org.springframework.data.mongodb.core.index.Indexed;
+import org.springframework.data.mongodb.core.mapping.DBRef;
 
 public class ExamPaper implements Serializable {
 
@@ -11,23 +11,32 @@ public class ExamPaper implements Serializable {
 
     @Id
     private String id;
-
-    @Indexed(unique = true)
+    /**
+     * 考试ID
+     */
     private Long examId;
-
+    /**
+     * 课程代码
+     */
     private String courseCode;
-
+    /**
+     * 试卷类型
+     */
     private String groupCode;
-
-    private String paperId;
-
-    private Integer extractCount;// 抽取试卷次数
-
-    private Double weight;// 抽取权重比例
-
-    public static long getSerialVersionUID() {
-        return serialVersionUID;
-    }
+    /**
+     * 关联试卷
+     */
+    @DBRef
+    private Paper paper;
+    /**
+     * 抽取试卷次数
+     */
+    private Integer extractCount;
+    /**
+     * 抽取权重比例
+     * 整数类型 例如:70%  数据库里存70
+     */
+    private Integer weight;
 
     public String getId() {
         return id;
@@ -61,14 +70,6 @@ public class ExamPaper implements Serializable {
         this.groupCode = groupCode;
     }
 
-    public String getPaperId() {
-        return paperId;
-    }
-
-    public void setPaperId(String paperId) {
-        this.paperId = paperId;
-    }
-
     public Integer getExtractCount() {
         return extractCount;
     }
@@ -77,11 +78,20 @@ public class ExamPaper implements Serializable {
         this.extractCount = extractCount;
     }
 
-    public Double getWeight() {
+    public Integer getWeight() {
         return weight;
     }
 
-    public void setWeight(Double weight) {
+    public void setWeight(Integer weight) {
         this.weight = weight;
     }
+
+	public Paper getPaper() {
+		return paper;
+	}
+
+	public void setPaper(Paper paper) {
+		this.paper = paper;
+	}
+
 }

+ 181 - 15
cqb-paper/src/main/java/com/qmth/cqb/paper/model/ExtractConfig.java

@@ -1,27 +1,105 @@
 package com.qmth.cqb.paper.model;
 
 import java.io.Serializable;
+import java.util.List;
 import java.util.Map;
 
 import org.springframework.data.annotation.Id;
 
 import com.qmth.cqb.utils.enums.ExtractPolicy;
 
+/**
+ * 调卷规则
+ * @author chenken
+ *
+ */
 public class ExtractConfig implements Serializable {
 
     private static final long serialVersionUID = -5234564748332601375L;
-
+    /**
+     * 调卷规则ID
+     */
     @Id
     private String id;
-
+    /**
+     * 考试ID
+     */
     private Long examId;
-
+    /**
+     * 考试类型
+     * 		网络考试
+     * 		传统考试
+     */
+    private String examType;
+    /**
+     * 考试名称
+     */
+    private String examName;
+    /**
+     * 课程名称
+     */
+    private String courseName;
+    /**
+     * 课程代码
+     */
     private String courseCode;
-
-    private ExtractPolicy policy;// 抽卷规则
-
-    private Map params;// 类型参数
-
+    /**
+     * 调卷类型
+     * 		成套调用
+     * 		重组调用
+     */
+    private String callType;
+    /**
+     * 是否生成 1:生成 0:没生成
+     */
+    private Short ifFinish;
+    /**
+     * 已经生成的试卷ID Map
+     * 数据结构:
+     * {
+     * 		"A":"0001",
+     * 		"B":"0002"
+     * }
+     * A 类型下生成的paperId为 0001
+     * B 类型下生成的paperId为 0002
+     */
+    private Map<String,String> finishedPaperIdMap;
+    /**
+     * 抽取试卷对象集合
+     */
+    private List<ExamPaper> examPaperList;
+    /**
+     * 小题乱序
+     * 1:乱序
+     * 0:不乱序
+     */
+    private Short scrambling_the_question_order;
+    /**
+     * 选项乱序
+     * 1:乱序
+     * 0:不乱序
+     */
+    private Short scrambling_the_option_order;
+    
+    /**
+     * 抽卷规则
+     */
+    private ExtractPolicy policy;
+    /**
+     * 类型参数
+     */
+    private Map<String,Object> params;
+    /**
+     * 机构ID
+     */
+    private String orgId;
+    
+    public ExtractConfig(){}
+    
+    public ExtractConfig(String id){
+    	this.id = id;
+    }
+    
     public Long getExamId() {
         return examId;
     }
@@ -53,17 +131,105 @@ public class ExtractConfig implements Serializable {
     public void setPolicy(ExtractPolicy policy) {
         this.policy = policy;
     }
-
-    public Map getParams() {
+    
+    public String getExamType() {
+		return examType;
+	}
+
+	public void setExamType(String examType) {
+		this.examType = examType;
+	}
+
+	public String getExamName() {
+		return examName;
+	}
+
+	public void setExamName(String examName) {
+		this.examName = examName;
+	}
+
+	public String getCourseName() {
+		return courseName;
+	}
+
+	public void setCourseName(String courseName) {
+		this.courseName = courseName;
+	}
+
+	public String getCallType() {
+		return callType;
+	}
+
+	public void setCallType(String callType) {
+		this.callType = callType;
+	}
+
+	public Short getIfFinish() {
+		return ifFinish;
+	}
+
+	public void setIfFinish(Short ifFinish) {
+		if(ifFinish==null){
+			this.ifFinish = 0;
+		}else{
+			this.ifFinish = ifFinish;
+		}
+	}
+
+	public Map<String,Object> getParams() {
         return params;
     }
 
-    public void setParams(Map params) {
+    public void setParams(Map<String,Object> params) {
         this.params = params;
     }
 
-    public static long getSerialversionuid() {
-        return serialVersionUID;
-    }
-
+	public String getOrgId() {
+		return orgId;
+	}
+
+	public void setOrgId(String orgId) {
+		this.orgId = orgId;
+	}
+
+	public List<ExamPaper> getExamPaperList() {
+		return examPaperList;
+	}
+
+	public void setExamPaperList(List<ExamPaper> examPaperList) {
+		this.examPaperList = examPaperList;
+	}
+
+	public Short getScrambling_the_question_order() {
+		return scrambling_the_question_order;
+	}
+
+	public void setScrambling_the_question_order(Short scrambling_the_question_order) {
+		if(scrambling_the_question_order==null){
+			this.scrambling_the_question_order = 0;
+		}else{
+			this.scrambling_the_question_order = scrambling_the_question_order;
+		}
+	}
+
+	public Short getScrambling_the_option_order() {
+		return scrambling_the_option_order;
+	}
+
+	public void setScrambling_the_option_order(Short scrambling_the_option_order) {
+		if(scrambling_the_option_order==null){
+			this.scrambling_the_option_order = 0;
+		}else{
+			this.scrambling_the_option_order = scrambling_the_option_order;
+		}
+	}
+
+	public Map<String, String> getFinishedPaperIdMap() {
+		return finishedPaperIdMap;
+	}
+
+	public void setFinishedPaperIdMap(Map<String, String> finishedPaperIdMap) {
+		this.finishedPaperIdMap = finishedPaperIdMap;
+	}
+    
 }

+ 17 - 0
cqb-paper/src/main/java/com/qmth/cqb/paper/service/ExamPaperService.java

@@ -0,0 +1,17 @@
+package com.qmth.cqb.paper.service;
+
+import java.util.List;
+
+import com.qmth.cqb.paper.model.ExamPaper;
+
+/**
+ * @author  	chenken
+ * @date    	2017年4月17日 上午10:45:26
+ * @company 	QMTH
+ * @description ExamPaperService.java
+ */
+public interface ExamPaperService {
+	
+	public List<ExamPaper> findExamPaperList(ExamPaper condition);
+}
+

+ 30 - 0
cqb-paper/src/main/java/com/qmth/cqb/paper/service/ExamPaperServiceImpl.java

@@ -0,0 +1,30 @@
+package com.qmth.cqb.paper.service;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Example;
+import org.springframework.stereotype.Service;
+
+import com.qmth.cqb.paper.dao.ExamPaperRepo;
+import com.qmth.cqb.paper.model.ExamPaper;
+
+/**
+ * @author  	chenken
+ * @date    	2017年4月17日 上午10:46:40
+ * @company 	QMTH
+ * @description ExamPaperServiceImpl.java
+ */
+@Service("examPaperService")
+public class ExamPaperServiceImpl implements ExamPaperService {
+	
+	@Autowired
+	private ExamPaperRepo examPaperRepo;
+	
+	@Override
+	public List<ExamPaper> findExamPaperList(ExamPaper condition) {
+		return examPaperRepo.findAll(Example.of(condition));
+	}
+
+}
+

+ 45 - 0
cqb-paper/src/main/java/com/qmth/cqb/paper/service/ExtractConfigService.java

@@ -0,0 +1,45 @@
+package com.qmth.cqb.paper.service;
+
+import com.qmth.cqb.paper.model.ExtractConfig;
+import com.qmth.cqb.paper.model.Paper;
+
+/**
+ * 
+ * @author  	chenken
+ * @date    	2017年4月14日 下午6:08:15
+ * @company 	QMTH
+ * @description 调卷规则接口
+ */
+public interface ExtractConfigService {
+	/**
+	 * 根据考试ID和课程code获取规则
+	 * @param examId
+	 * @param courseCode
+	 * @return
+	 */
+	public ExtractConfig findConfig(ExtractConfig extractConfig);
+	/**
+	 * 根据ID获取调卷规则
+	 * @param id
+	 * @return
+	 */
+	public ExtractConfig findConfigById(String id);
+	/**
+	 * 保存调卷规则
+	 */
+	public void saveExtractConfig(ExtractConfig extractConfig);
+	/**
+	 * 按照设定调卷规则生成一套试卷
+	 * @param extractConfigId	规则 ID
+	 * @return 
+	 */
+	public void makePaperByConfig(String extractConfigId);
+	/**
+	 * 根据给定试卷重组试卷,生成新的试卷
+	 * @param paper					给定的试卷
+	 * @param upSetQuestionOrder	小题乱序		1:乱序  0:不乱序
+	 * @param upSetOptionOrder		选项乱序		1:乱序  0:不乱序
+	 * @return
+	 */
+	public Paper recombinationPaper(Paper paper,int upSetQuestionOrder,int upSetOptionOrder);
+}

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

@@ -0,0 +1,256 @@
+package com.qmth.cqb.paper.service;
+
+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 org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Example;
+import org.springframework.stereotype.Service;
+
+import cn.com.qmth.examcloud.common.dto.question.enums.QuesStructType;
+
+import com.qmth.cqb.paper.dao.ExtractConfigRepo;
+import com.qmth.cqb.paper.dao.PaperDetailRepo;
+import com.qmth.cqb.paper.dao.PaperDetailUnitRepo;
+import com.qmth.cqb.paper.dao.PaperRepo;
+import com.qmth.cqb.paper.model.ExamPaper;
+import com.qmth.cqb.paper.model.ExtractConfig;
+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.dao.QuesRepo;
+import com.qmth.cqb.question.model.QuesOption;
+import com.qmth.cqb.question.model.Question;
+
+/**
+ * 
+ * @author  	chenken
+ * @date    	2017年4月14日 下午6:07:55
+ * @company 	QMTH
+ * @description ExtractConfigServiceImpl.java
+ */
+@Service("extractConfigService")
+public class ExtractConfigServiceImpl implements ExtractConfigService {
+	
+	@Autowired
+    private ExtractConfigRepo extractConfigRepo;
+	
+	@Autowired
+	private PaperDetailRepo paperDetailRepo;
+
+    @Autowired
+    private PaperDetailUnitRepo paperDetailUnitRepo;
+    
+    @Autowired
+    private PaperDetailUnitService paperDetailUnitService;
+    
+    @Autowired
+    PaperService paperService;
+    
+    @Autowired
+    PaperRepo paperRepo;
+    
+    @Autowired
+    QuesRepo quesRepo;
+    
+	@Override
+	public ExtractConfig findConfig(ExtractConfig condition) {
+		if(condition.getExamId()==null){
+			return null;
+		}
+		if(StringUtils.isBlank(condition.getCourseCode())){
+			return null;
+		}
+		ExtractConfig tempConfig =  extractConfigRepo.findOne(Example.of(condition));
+        return tempConfig;
+	}
+
+	@Override
+	public void saveExtractConfig(ExtractConfig extractConfig) {
+		if(extractConfig.getScrambling_the_question_order()==null){
+			extractConfig.setScrambling_the_question_order((short) 0);
+		}
+		if(extractConfig.getScrambling_the_option_order()==null){
+			extractConfig.setScrambling_the_option_order((short) 0);
+		}
+		List<ExamPaper> examPapers = extractConfig.getExamPaperList();
+		for(int i=0;i<examPapers.size();i++){
+			ExamPaper examPaper = examPapers.get(i);
+			Paper paper = examPaper.getPaper();
+			paper = paperRepo.findOne(paper.getId());
+			examPaper.setPaper(paper);
+		}
+		extractConfigRepo.save(extractConfig);
+	}
+
+	@Override
+	public ExtractConfig findConfigById(String id) {
+		if(StringUtils.isBlank(id)){
+			return null;
+		}
+		return extractConfigRepo.findOne(id);
+	}
+	
+	@Override
+	public void makePaperByConfig(String extractConfigId) {
+		Map<String, String> finishedPaperIdMap = new HashMap<String, String>();
+		//取出调卷规则
+		ExtractConfig extractConfig = this.findConfigById(extractConfigId);
+		if(extractConfig==null){
+			throw new RuntimeException("调卷规则不存在");
+		}
+		//获得抽取好的试卷
+		Map<String,Paper> paperMap = this.getExamPaperByProbability(extractConfig.getExamPaperList());
+        for (Map.Entry<String, Paper> entry : paperMap.entrySet()) {
+        	String key = entry.getKey();
+        	//根据原有试卷重新组卷得到新试卷
+        	Paper newPaper = this.recombinationPaper(entry.getValue(), 
+							        				 extractConfig.getScrambling_the_question_order(), 
+							        				 extractConfig.getScrambling_the_option_order());
+        	finishedPaperIdMap.put(key, newPaper.getId());
+        }
+        /**
+         * 设置map,并保存调卷规则
+         * 如果已经设置过了,就不再设置
+         */
+        if(extractConfig.getIfFinish()==null){
+        	extractConfig.setFinishedPaperIdMap(finishedPaperIdMap);
+        	extractConfig.setIfFinish((short)1);
+        	extractConfigRepo.save(extractConfig);
+        }
+	}
+
+	/**
+	 * 重组试卷,生成新的试卷
+	 * @param paper					选中的试卷
+	 * @param upSetQuestionOrder	小题乱序		1:乱序  0:不乱序
+	 * @param upSetOptionOrder		选项乱序		1:乱序  0:不乱序
+	 * @return
+	 */
+	public Paper recombinationPaper(Paper paper,int upSetQuestionOrder,int upSetOptionOrder){
+		List<PaperDetail> paperDetails = paperDetailRepo.findByPaper(paper);
+		paper.setId(null);
+		Paper newPaper = paperRepo.save(paper);//重新保存成新的paper
+		for(int i = 0;i<paperDetails.size();i++){
+			PaperDetail paperDetail = paperDetails.get(i);
+			List<PaperDetailUnit> paperDetailUnits = paperDetailUnitService.getUnitsByPaperDetail(paperDetail);
+			paperDetail.setPaper(newPaper);//关联新Paper
+			paperDetail.setId(null);
+			PaperDetail newPaperDetail = paperDetailRepo.save(paperDetail);//保存新的paperDetail
+			//小题乱序
+			if(upSetQuestionOrder==1){
+				Collections.shuffle(paperDetailUnits);//打乱小题List
+			}
+			for(int j = 0;j<paperDetailUnits.size();j++){
+				//重新设置保存PaperDetailUnit、question,
+				PaperDetailUnit paperDetailUnit = paperDetailUnits.get(j);
+				paperDetailUnit.setPaper(newPaper);				//关联新Paper
+				paperDetailUnit.setPaperDetail(newPaperDetail); //关联新paperDetail
+				paperDetailUnit.setNumber(j+1);					//重新设置序号
+				reSavePaperDetailUtilAndQuestion(paperDetailUnit,upSetOptionOrder);
+			}
+			
+		}
+		return newPaper;
+	}
+	
+	/**
+	 * 每个试卷类型取出一套试卷
+	 * {
+	 * 	 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) {
+       	 	return null;  
+        }
+		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);
+				}
+			}
+		}
+		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;
+	}
+	
+	/**
+	 * 重新设置并保存paperDetailUnit和question
+	 * @param paperDetailUnit
+	 * @param upSetOptionOrder
+	 */
+	private void reSavePaperDetailUtilAndQuestion(PaperDetailUnit paperDetailUnit,Integer upSetOptionOrder){
+		Question question = paperDetailUnit.getQuestion();
+		//选项乱序
+		if(upSetOptionOrder==1){
+			//单选或多选
+			if(question.getQuestionType()==QuesStructType.SINGLE_ANSWER_QUESTION||
+			   question.getQuestionType()==QuesStructType.MULTIPLE_ANSWER_QUESTION){
+				List<QuesOption> options = question.getQuesOptions();
+				Collections.shuffle(options);//打乱选项List
+				for(int k = 0;k<options.size();k++){
+					QuesOption quesOption = options.get(k);
+					Character num = (char) (k+64+1);
+					quesOption.setNumber(String.valueOf(num));//重新设置顺序
+				}
+			}
+		}
+		question.setId(null);
+		Question newQuestion = quesRepo.save(question);
+		paperDetailUnit.setQuestion(newQuestion);	//保存新的试题
+		paperDetailUnit.setId(null);
+		paperDetailUnitRepo.save(paperDetailUnit);	//保存新的paperDetailUnit
+	}
+}

+ 9 - 14
cqb-paper/src/main/java/com/qmth/cqb/paper/service/ImportPaperService.java

@@ -14,6 +14,8 @@ import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
 import org.docx4j.wml.P;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.commons.CommonsMultipartFile;
@@ -35,23 +37,15 @@ import com.qmth.cqb.utils.enums.PaperStatus;
 import com.qmth.cqb.utils.enums.PaperType;
 import com.qmth.cqb.utils.enums.QuesUnit;
 import com.qmth.cqb.utils.word.DocxProcessUtil;
-import org.springframework.web.multipart.commons.CommonsMultipartFile;
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
-import org.docx4j.wml.P;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
+
 import cn.com.qmth.examcloud.common.dto.question.enums.QuesStructType;
 import cn.com.qmth.examcloud.common.uac.entity.AccessUser;
 
 @Service
 public class ImportPaperService {
+
     protected static final Logger log = LoggerFactory.getLogger(ImportPaperService.class);
-    
+
     @Autowired
     PaperRepo paperRepo;
 
@@ -88,6 +82,7 @@ public class ImportPaperService {
             IOUtils.copyLarge(file.getInputStream(), os);
         } catch (Exception e) {
             e.printStackTrace();
+            log.error("上传文件异常:" + e.getMessage());
         } finally {
             IOUtils.closeQuietly(os);
         }
@@ -107,16 +102,15 @@ public class ImportPaperService {
         if (errorInfo == null) {
             errorInfo = "";
             errorInfo += processImportPaper(paperName, courseNo, courseName, user, file);
-            if (StringUtils.isEmpty(errorInfo)) {   
+            if (StringUtils.isEmpty(errorInfo)) {
                 return "success";
             } else {
-                log.error("导入异常:"+errorInfo);
+                log.error("导入异常:" + errorInfo);
                 return errorInfo;
             }
         } else {
             return errorInfo;
         }
-
     }
 
     /**
@@ -288,6 +282,7 @@ public class ImportPaperService {
         } catch (Exception e) {
             e.printStackTrace();
             importPaperCheck.setErrorInfo(e.getMessage());
+            log.error("导入处理异常:" + e.getMessage());
         } finally {
             wordMLPackage = null;
             tmpWordMlPackage = null;

+ 550 - 550
cqb-paper/src/main/java/com/qmth/cqb/paper/service/PaperService.java

@@ -1,550 +1,550 @@
-package com.qmth.cqb.paper.service;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.domain.Example;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.PageRequest;
-import org.springframework.stereotype.Service;
-
-import com.google.gson.Gson;
-import com.qmth.cqb.paper.dao.ExamPaperRepo;
-import com.qmth.cqb.paper.dao.PaperDetailRepo;
-import com.qmth.cqb.paper.dao.PaperDetailUnitRepo;
-import com.qmth.cqb.paper.dao.PaperRepo;
-import com.qmth.cqb.paper.dto.PaperDetailExp;
-import com.qmth.cqb.paper.dto.PaperDetailUnitExp;
-import com.qmth.cqb.paper.dto.PaperExp;
-import com.qmth.cqb.paper.model.ExamPaper;
-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.paper.model.PaperSearchInfo;
-import com.qmth.cqb.question.dao.QuesBakRepo;
-import com.qmth.cqb.question.dao.QuesRepo;
-import com.qmth.cqb.question.model.Question;
-import com.qmth.cqb.question.model.QuestionBak;
-import com.qmth.cqb.question.service.QuesService;
-import com.qmth.cqb.utils.BeanCopierUtil;
-import com.qmth.cqb.utils.CommonUtils;
-import com.qmth.cqb.utils.enums.PaperStatus;
-import com.qmth.cqb.utils.enums.PaperType;
-
-import cn.com.qmth.examcloud.common.dto.question.enums.QuesStructType;
-import cn.com.qmth.examcloud.common.uac.entity.AccessUser;
-
-/**
- * Created by songyue on 16/12/28.
- */
-@Service
-public class PaperService {
-
-    @Autowired
-    PaperRepo paperRepo;
-
-    @Autowired
-    PaperDetailService paperDetailService;
-
-    @Autowired
-    ExamPaperRepo examPaperRepo;
-
-    @Autowired
-    PaperDetailRepo paperDetailRepo;
-
-    @Autowired
-    PaperDetailUnitRepo paperDetailUnitRepo;
-
-    @Autowired
-    QuesRepo quesRepo;
-
-    @Autowired
-    QuesBakRepo quesBakRepo;
-
-    @Autowired
-    Gson gson;
-
-    @Autowired
-    PaperDetailUnitService paperDetailUnitService;
-
-    @Autowired
-    QuesService quesService;
-
-    /**
-     * 查询所有已导入试卷
-     *
-     * @param paperSearchInfo
-     * @param curPage
-     * @param pageSize
-     * @return
-     */
-    public Page<Paper> getImportPapers(PaperSearchInfo paperSearchInfo, int curPage, int pageSize) {
-        formatPaperSearchInfo(paperSearchInfo);
-        Paper importPaper = BeanCopierUtil.copyProperties(paperSearchInfo, Paper.class);
-        importPaper.setPaperType(PaperType.IMPORT);
-        return paperRepo.findAll(Example.of(importPaper), new PageRequest(curPage - 1, pageSize));
-    }
-
-    /**
-     * 保存试卷
-     *
-     * @param paperExp
-     * @return
-     */
-    public Paper savePaper(PaperExp paperExp) {
-        Paper paper = BeanCopierUtil.copyProperties(paperExp, Paper.class);
-        formatPaper(paper);
-        return paperRepo.save(paper);
-    }
-
-    /**
-     * 查询所有已组试卷
-     *
-     * @param paperSearchInfo
-     * @param curPage
-     * @param pageSize
-     * @return
-     */
-    public Page<Paper> getGenPapers(PaperSearchInfo paperSearchInfo, int curPage, int pageSize) {
-        formatPaperSearchInfo(paperSearchInfo);
-        Paper importPaper = BeanCopierUtil.copyProperties(paperSearchInfo, Paper.class);
-        importPaper.setPaperType(PaperType.GENERATE);
-        return paperRepo.findAll(Example.of(importPaper), new PageRequest(curPage - 1, pageSize));
-    }
-
-    /**
-     * 查询考试试卷
-     *
-     * @param id
-     * @param courseCode
-     * @param groupCode
-     * @return
-     */
-    public List<Paper> listExamPapers(long id, String courseCode, String groupCode) {
-        List<Paper> papers = new ArrayList<Paper>();
-        ExamPaper examPaper = new ExamPaper();
-        examPaper.setExamId(id);
-        examPaper.setCourseCode(courseCode);
-        examPaper.setGroupCode(groupCode);
-        Example<ExamPaper> example = Example.of(examPaper);
-        List<ExamPaper> examPapers = examPaperRepo.findAll(example);
-        for (ExamPaper ePaper : examPapers) {
-            Paper paper = paperRepo.findOne(ePaper.getPaperId());
-            papers.add(paper);
-        }
-        return papers;
-    }
-
-    /**
-     * 设置考试试卷
-     *
-     * @param examId
-     * @param courseCode
-     * @param groupCode
-     * @param paperId
-     * @return
-     */
-    public void joinToExamPaper(long examId, String courseCode, String groupCode, String paperId) {
-        ExamPaper examPaper = new ExamPaper();
-        examPaper.setExamId(examId);
-        examPaper.setGroupCode(groupCode);
-        examPaper.setCourseCode(courseCode);
-        examPaper.setPaperId(paperId);
-        examPaperRepo.save(examPaper);
-    }
-
-    public void releaseExamPaper(long examId, String courseCode, String groupCode, String paperId) {
-        ExamPaper examPaper = new ExamPaper();
-        examPaper.setExamId(examId);
-        examPaper.setGroupCode(groupCode);
-        examPaper.setCourseCode(courseCode);
-        examPaper.setPaperId(paperId);
-        examPaperRepo.delete(examPaper);
-    }
-
-    public Set<String> listGroupCodes(long examId, String courseCode) {
-        Set<String> groupSet = new HashSet<String>();
-        ExamPaper examPaper = new ExamPaper();
-        examPaper.setExamId(examId);
-        examPaper.setCourseCode(courseCode);
-        List<ExamPaper> examPapers = examPaperRepo.findAll(Example.of(examPaper));
-        for (ExamPaper expaper : examPapers) {
-            groupSet.add(expaper.getGroupCode());
-        }
-        return groupSet;
-    }
-
-    public void deletGroupCode(long examId, String courseCode, String groupCode) {
-        ExamPaper examPaper = new ExamPaper();
-        examPaper.setExamId(examId);
-        examPaper.setCourseCode(courseCode);
-        examPaper.setCourseCode(courseCode);
-        examPaperRepo.delete(examPaper);
-    }
-
-    /**
-     * 根据试卷ID获取试卷下面的大题
-     *
-     * @param id
-     * @return
-     */
-    public List<PaperDetail> findPaperDetailsById(String id) {
-        return paperDetailService.getPaperDetailsByPaper(paperRepo.findOne(id));
-    }
-
-    /**
-     * 批量删除试卷
-     *
-     * @param paperIds
-     */
-    public String deletePapers(List<String> paperIds) {
-        String msg = "";
-        List<Paper> papers = CommonUtils.toList(paperRepo.findAll(paperIds));
-        for (Paper paper : papers) {
-            List<PaperDetailUnit> units = paperDetailUnitRepo.findByPaper(paper);
-            if (units.size() > 0) {
-                return msg = "试卷里面还有小题,不能删除";
-            }
-
-        }
-        paperDetailService.deletePaperDetailsByPapers(papers);
-        paperRepo.delete(papers);
-        msg = "success";
-        return msg;
-
-    }
-
-    /**
-     * 批量通过试卷
-     *
-     * @param paperIds
-     */
-    public void passPapers(List<String> paperIds) {
-        List<Paper> papers = CommonUtils.toList(paperRepo.findAll(paperIds));
-        papers.stream().forEach(paper -> {
-            paper.setPaperStatus(PaperStatus.PASS);
-        });
-        paperRepo.save(papers);
-    }
-
-    /**
-     * 批量不通过试卷
-     *
-     * @param paperIds
-     */
-    public void noPassPapers(List<String> paperIds) {
-        List<Paper> papers = CommonUtils.toList(paperRepo.findAll(paperIds));
-        papers.stream().forEach(paper -> {
-            paper.setPaperStatus(PaperStatus.NOPASS);
-        });
-        paperRepo.save(papers);
-    }
-
-    /**
-     * 批量待审核试卷
-     *
-     * @param paperIds
-     */
-    public void backPapers(List<String> paperIds) {
-        List<Paper> papers = CommonUtils.toList(paperRepo.findAll(paperIds));
-        papers.stream().forEach(paper -> {
-            paper.setPaperStatus(PaperStatus.DRAFT);
-        });
-        paperRepo.save(papers);
-    }
-
-    /**
-     * 初始化导出试卷DTO
-     *
-     * @param id
-     * @return
-     */
-    public PaperExp getPaperDto(String id) {
-
-        // 获取paper
-        Paper paper = paperRepo.findOne(id);
-        // 创建paperDto
-        PaperExp paperExp = BeanCopierUtil.copyProperties(paper, PaperExp.class);
-        // 获取大题
-        List<PaperDetail> paperDetails = paperDetailRepo.findByPaper(paper);
-        List<PaperDetailExp> paperDetailExps = BeanCopierUtil.copyPropertiesOfList(paperDetails, PaperDetailExp.class);
-        paperExp.setPaperDetails(paperDetailExps);
-
-        // 封装小题
-        for (int i = 0; i < paperDetailExps.size(); i++) {
-            List<PaperDetailUnit> paperDetailUnits = paperDetailUnitRepo.findByPaperDetail(paperDetails.get(i));
-            if (paperDetailUnits != null && paperDetailUnits.size() > 0) {
-                List<PaperDetailUnitExp> paperDetailUnitExps = BeanCopierUtil.copyPropertiesOfList(paperDetailUnits,
-                        PaperDetailUnitExp.class);
-                paperDetailExps.get(i).setPaperDetailUnits(paperDetailUnitExps);
-            } else {
-                paperDetailExps.get(i).setUnitCount(0);
-            }
-
-        }
-        // 初始化试卷内容
-        initPaper(paperExp);
-
-        return paperExp;
-    }
-
-    /**
-     * 初始化试卷内容(增加序号)
-     *
-     * @param paperExp
-     */
-    public void initPaper(PaperExp paperExp) {
-        if (paperExp.getPaperDetails() == null || paperExp.getPaperDetails().size() == 0) {
-            return;
-        }
-        int mainNum = 0;
-        int subNum = 0;
-        Collections.sort(paperExp.getPaperDetails());
-        for (PaperDetailExp paperDetail : paperExp.getPaperDetails()) {
-            // 大题序号
-            paperDetail.setCnNum(CommonUtils.toCHNum(paperDetail.getNumber()));
-            paperDetail.setNumber(++mainNum);
-            if (paperDetail.getPaperDetailUnits() == null || paperDetail.getPaperDetailUnits().size() == 0) {
-                return;
-            }
-            // 小题序号
-            for (PaperDetailUnitExp paperDetailUnit : paperDetail.getPaperDetailUnits()) {
-
-                quesService.formatQuesUnit(paperDetailUnit.getQuestion());
-
-                List<Question> subQuesList = paperDetailUnit.getQuestion().getSubQuestions();
-                // 套题序号
-                if (subQuesList != null && subQuesList.size() > 0) {
-                    for (Question subQues : subQuesList) {
-                        Map<String, String> params = new HashMap<String, String>();
-                        params.put("number", String.valueOf(++subNum));
-                        subQues.setQuesParams(params);
-                        quesService.formatQuesUnit(subQues);
-                    }
-                } else {
-                    paperDetailUnit.setNumber(++subNum);
-                }
-            }
-        }
-    }
-
-    /**
-     * 格式化查询条件
-     *
-     * @param paperSearchInfo
-     */
-    public void formatPaperSearchInfo(PaperSearchInfo paperSearchInfo) {
-        if (StringUtils.isEmpty(paperSearchInfo.getCourseNo())) {
-            paperSearchInfo.setCourseNo(null);
-        }
-        if (StringUtils.isEmpty(paperSearchInfo.getCreateTime())) {
-            paperSearchInfo.setCreateTime(null);
-        }
-        if (StringUtils.isEmpty(paperSearchInfo.getCreator())) {
-            paperSearchInfo.setCreator(null);
-        }
-        if (StringUtils.isEmpty(paperSearchInfo.getName())) {
-            paperSearchInfo.setName(null);
-        }
-    }
-
-    /**
-     * 填充大题小题数量与分数
-     *
-     * @param paper
-     */
-    public void formatPaper(Paper paper) {
-        List<PaperDetail> paperDetails = paperDetailRepo.findByPaper(paper);
-        // 计算试卷总分
-        List<PaperDetailUnit> paperDetailUnitAll = paperDetailUnitRepo.findByPaper(paper);
-        double totalScore = 0;
-        for (PaperDetailUnit unit : paperDetailUnitAll) {
-            if (unit.getScore() != null) {
-                totalScore += unit.getScore();
-            }
-
-        }
-        // 计算各大题总分
-        for (PaperDetail paperDetail : paperDetails) {
-            List<PaperDetailUnit> paperDetailUnits = paperDetailUnitRepo.findByPaperDetail(paperDetail);
-            Collections.sort(paperDetailUnits);
-            if (paperDetailUnits.size() > 0) {
-                int count = 0;
-                double score = 0;
-                int nestQusNum = 0;
-                for (PaperDetailUnit unit : paperDetailUnits) {
-                    if (unit.getScore() != null) {
-                        score += unit.getScore();
-                    }
-                    if (unit.getQuestion().getSubQuestions() != null
-                            && unit.getQuestion().getSubQuestions().size() > 0) {
-                        nestQusNum += unit.getQuestion().getSubQuestions().size() - 1;
-                    }
-
-                }
-                count = paperDetailUnits.size() + nestQusNum;
-                paperDetail.setScore(score);
-                paperDetail.setUnitCount(count);
-            } else {
-                paperDetail.setScore(0d);
-            }
-        }
-        paper.setUnitCount(paperDetailUnitAll.size());
-        paper.setPaperDetailCount(paperDetails.size());
-        paper.setTotalScore(totalScore);
-        paperDetailRepo.save(paperDetails);
-        paperRepo.save(paper);
-    }
-
-    /**
-     * 先备份准备删掉的试题,然后再删掉
-     *
-     * @param questionId
-     * @return
-     */
-    public List<String> deleteImportQuestionById(String questionId) {
-        Question ques = quesRepo.findOne(questionId);
-        List<PaperDetailUnit> pdus = CommonUtils.toList(paperDetailUnitRepo.findByQuestion(ques));
-        List<String> paperNames = new ArrayList<String>();
-        List<PaperDetailUnit> needPdus = new ArrayList<PaperDetailUnit>();// 需要删除的小题
-        List<Paper> papers = new ArrayList<Paper>();
-        for (PaperDetailUnit pdu : pdus) {
-            if (PaperType.GENERATE == pdu.getPaper().getPaperType()) {
-                paperNames.add(pdu.getPaper().getName());
-                needPdus.add(pdu);
-                if (!papers.contains(pdu.getPaper())) {
-                    papers.add(pdu.getPaper());
-                }
-
-            }
-        }
-        if (paperNames.size() == 0) {// 此试题没有被组卷调用,则可以删除此试题
-            paperDetailUnitRepo.delete(needPdus);
-            quesBakRepo.save(BeanCopierUtil.copyProperties(ques, QuestionBak.class));
-            quesRepo.delete(ques);
-            for (Paper paper : papers) {
-                formatPaper(paper);
-            }
-
-        }
-        return paperNames;
-    }
-
-    /**
-     * 向试卷中插入一个试题
-     *
-     * @param paperId
-     * @param paperDetailId
-     * @return
-     */
-    public Paper insertQuestionToPaper(String paperId, String paperDetailId, Question question, AccessUser user) {
-        question.setOrgId(user.getOrgId().toString());
-        quesService.updateQuesWord(question);
-        question = quesRepo.save(question);
-        Paper paper = paperRepo.findOne(paperId);
-        PaperDetail pd = paperDetailRepo.findOne(paperDetailId);
-        PaperDetailUnit pdu = new PaperDetailUnit();
-        List<PaperDetailUnit> pdus = paperDetailUnitRepo.findByPaperDetail(pd);
-        pdu.setPaper(paper);
-        pdu.setQuestionType(question.getQuestionType());
-        pdu.setQuestion(question);
-        pdu.setCreateTime(CommonUtils.getCurDateTime());
-        pdu.setPaperDetail(pd);
-        pdus.add(pdu);
-        Collections.sort(pdus);
-        pdu.setNumber(pdus.indexOf(pdu) + 1);
-        pdu.setScore(0d);
-        paperDetailUnitRepo.save(pdu);
-        formatPaper(paper);
-        return paper;
-
-    }
-
-    /**
-     * 获取试题所的试卷名称
-     *
-     * @param questionId
-     * @return
-     */
-    public List<String> getPaperNamesByQuestionId(String questionId) {
-        List<String> paperNames = new ArrayList<String>();
-        List<PaperDetailUnit> pdus = paperDetailUnitRepo.findByQuestion(quesRepo.findOne(questionId));
-        for (PaperDetailUnit pdu : pdus) {
-            paperNames.add(pdu.getPaper().getName());
-        }
-        return paperNames;
-
-    }
-
-    public Page<Question> listQuestionforSelect(String paperId, int curPage, int pageSize, QuesStructType quesType) {
-        Set<String> selectedIds = new HashSet<>();
-        Paper paper = paperRepo.findOne(paperId);
-        // QuestionSearchCondition ques = new QuestionSearchCondition();
-        // if (quesType != null) {
-        // ques.setQuestionType(quesType);
-        // }
-        // Map<String, String> quesParams = new HashMap<String, String>();
-        // quesParams.put("courseName", paper.getCourseName());
-        // ques.setQuesParams(quesParams);
-        List<PaperDetailUnit> pdus = paperDetailUnitRepo.findByPaper(paper);
-        for (PaperDetailUnit pdu : pdus) {
-            selectedIds.add(pdu.getQuestion().getId());
-        }
-        // Page<Question> allQuestions = quesService.findAll(ques, curPage,
-        // pageSize);
-        // Iterator<Question> que = allQuestions.iterator();
-        // while (que.hasNext()) {
-        // if (selectedIds.contains(que.next().getId())) {
-        // que.remove();
-        // }
-        // }
-        return quesService.findByIdExclude(selectedIds, paper.getCourseNo(), quesType, curPage, pageSize);
-    }
-
-    public Paper selectQuestionsToPaper(String paperId, String paperDetailId, List<Question> questions) {
-        Paper paper = paperRepo.findOne(paperId);
-        PaperDetail pd = paperDetailRepo.findOne(paperDetailId);
-        List<PaperDetailUnit> pdus = paperDetailUnitRepo.findByPaperDetail(pd);
-        List<PaperDetailUnit> saveUnits = new ArrayList<PaperDetailUnit>();
-        for (Question ques : questions) {
-            PaperDetailUnit pdu = new PaperDetailUnit();
-            pdu.setPaper(paper);
-            pdu.setQuestionType(ques.getQuestionType());
-            pdu.setQuestion(ques);
-            pdu.setCreateTime(CommonUtils.getCurDateTime());
-            pdu.setPaperDetail(pd);
-            pdu.setScore(0d);
-            pdus.add(pdu);
-            saveUnits.add(pdu);
-        }
-        Collections.sort(pdus);
-        for (int i = 0; i < saveUnits.size(); i++) {
-            saveUnits.get(i).setNumber(pdus.indexOf(saveUnits.get(i)) + 1);
-        }
-
-        paperDetailUnitRepo.save(saveUnits);
-        formatPaper(paper);
-        return paper;
-    }
-
-    public String checkPaperName(String paperName, String orgId) {
-        String msg = null;
-        Paper paperTemp = new Paper();
-        paperTemp.setName(paperName);
-        paperTemp.setOrgId(orgId);
-        Paper paper = paperRepo.findOne(Example.of(paperTemp));
-        if (paper != null) {
-            msg = "试卷名称重复,请重新命名";
-        }
-        return msg;
-
-    }
-
-}
+package com.qmth.cqb.paper.service;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Example;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.stereotype.Service;
+
+import com.google.gson.Gson;
+import com.qmth.cqb.paper.dao.ExamPaperRepo;
+import com.qmth.cqb.paper.dao.PaperDetailRepo;
+import com.qmth.cqb.paper.dao.PaperDetailUnitRepo;
+import com.qmth.cqb.paper.dao.PaperRepo;
+import com.qmth.cqb.paper.dto.PaperDetailExp;
+import com.qmth.cqb.paper.dto.PaperDetailUnitExp;
+import com.qmth.cqb.paper.dto.PaperExp;
+import com.qmth.cqb.paper.model.ExamPaper;
+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.paper.model.PaperSearchInfo;
+import com.qmth.cqb.question.dao.QuesBakRepo;
+import com.qmth.cqb.question.dao.QuesRepo;
+import com.qmth.cqb.question.model.Question;
+import com.qmth.cqb.question.model.QuestionBak;
+import com.qmth.cqb.question.service.QuesService;
+import com.qmth.cqb.utils.BeanCopierUtil;
+import com.qmth.cqb.utils.CommonUtils;
+import com.qmth.cqb.utils.enums.PaperStatus;
+import com.qmth.cqb.utils.enums.PaperType;
+
+import cn.com.qmth.examcloud.common.dto.question.enums.QuesStructType;
+import cn.com.qmth.examcloud.common.uac.entity.AccessUser;
+
+/**
+ * Created by songyue on 16/12/28.
+ */
+@Service
+public class PaperService {
+
+    @Autowired
+    PaperRepo paperRepo;
+
+    @Autowired
+    PaperDetailService paperDetailService;
+
+    @Autowired
+    ExamPaperRepo examPaperRepo;
+
+    @Autowired
+    PaperDetailRepo paperDetailRepo;
+
+    @Autowired
+    PaperDetailUnitRepo paperDetailUnitRepo;
+
+    @Autowired
+    QuesRepo quesRepo;
+
+    @Autowired
+    QuesBakRepo quesBakRepo;
+
+    @Autowired
+    Gson gson;
+
+    @Autowired
+    PaperDetailUnitService paperDetailUnitService;
+
+    @Autowired
+    QuesService quesService;
+
+    /**
+     * 查询所有已导入试卷
+     *
+     * @param paperSearchInfo
+     * @param curPage
+     * @param pageSize
+     * @return
+     */
+    public Page<Paper> getImportPapers(PaperSearchInfo paperSearchInfo, int curPage, int pageSize) {
+        formatPaperSearchInfo(paperSearchInfo);
+        Paper importPaper = BeanCopierUtil.copyProperties(paperSearchInfo, Paper.class);
+        importPaper.setPaperType(PaperType.IMPORT);
+        return paperRepo.findAll(Example.of(importPaper), new PageRequest(curPage - 1, pageSize));
+    }
+
+    /**
+     * 保存试卷
+     *
+     * @param paperExp
+     * @return
+     */
+    public Paper savePaper(PaperExp paperExp) {
+        Paper paper = BeanCopierUtil.copyProperties(paperExp, Paper.class);
+        formatPaper(paper);
+        return paperRepo.save(paper);
+    }
+
+    /**
+     * 查询所有已组试卷
+     *
+     * @param paperSearchInfo
+     * @param curPage
+     * @param pageSize
+     * @return
+     */
+    public Page<Paper> getGenPapers(PaperSearchInfo paperSearchInfo, int curPage, int pageSize) {
+        formatPaperSearchInfo(paperSearchInfo);
+        Paper importPaper = BeanCopierUtil.copyProperties(paperSearchInfo, Paper.class);
+        importPaper.setPaperType(PaperType.GENERATE);
+        return paperRepo.findAll(Example.of(importPaper), new PageRequest(curPage - 1, pageSize));
+    }
+
+    /**
+     * 查询考试试卷
+     *
+     * @param id
+     * @param courseCode
+     * @param groupCode
+     * @return
+     */
+    public List<Paper> listExamPapers(long id, String courseCode, String groupCode) {
+        List<Paper> papers = new ArrayList<Paper>();
+        ExamPaper examPaper = new ExamPaper();
+        examPaper.setExamId(id);
+        examPaper.setCourseCode(courseCode);
+        examPaper.setGroupCode(groupCode);
+        Example<ExamPaper> example = Example.of(examPaper);
+        List<ExamPaper> examPapers = examPaperRepo.findAll(example);
+        for (ExamPaper ePaper : examPapers) {
+            Paper paper = paperRepo.findOne(ePaper.getPaper().getId());
+            papers.add(paper);
+        }
+        return papers;
+    }
+
+    /**
+     * 设置考试试卷
+     *
+     * @param examId
+     * @param courseCode
+     * @param groupCode
+     * @param paperId
+     * @return
+     */
+    public void joinToExamPaper(long examId, String courseCode, String groupCode, String paperId) {
+        ExamPaper examPaper = new ExamPaper();
+        examPaper.setExamId(examId);
+        examPaper.setGroupCode(groupCode);
+        examPaper.setCourseCode(courseCode);
+//        examPaper.setPaperId(paperId);
+        examPaperRepo.save(examPaper);
+    }
+
+    public void releaseExamPaper(long examId, String courseCode, String groupCode, String paperId) {
+        ExamPaper examPaper = new ExamPaper();
+        examPaper.setExamId(examId);
+        examPaper.setGroupCode(groupCode);
+        examPaper.setCourseCode(courseCode);
+//        examPaper.setPaperId(paperId);
+        examPaperRepo.delete(examPaper);
+    }
+
+    public Set<String> listGroupCodes(long examId, String courseCode) {
+        Set<String> groupSet = new HashSet<String>();
+        ExamPaper examPaper = new ExamPaper();
+        examPaper.setExamId(examId);
+        examPaper.setCourseCode(courseCode);
+        List<ExamPaper> examPapers = examPaperRepo.findAll(Example.of(examPaper));
+        for (ExamPaper expaper : examPapers) {
+            groupSet.add(expaper.getGroupCode());
+        }
+        return groupSet;
+    }
+
+    public void deletGroupCode(long examId, String courseCode, String groupCode) {
+        ExamPaper examPaper = new ExamPaper();
+        examPaper.setExamId(examId);
+        examPaper.setCourseCode(courseCode);
+        examPaper.setCourseCode(courseCode);
+        examPaperRepo.delete(examPaper);
+    }
+
+    /**
+     * 根据试卷ID获取试卷下面的大题
+     *
+     * @param id
+     * @return
+     */
+    public List<PaperDetail> findPaperDetailsById(String id) {
+        return paperDetailService.getPaperDetailsByPaper(paperRepo.findOne(id));
+    }
+
+    /**
+     * 批量删除试卷
+     *
+     * @param paperIds
+     */
+    public String deletePapers(List<String> paperIds) {
+        String msg = "";
+        List<Paper> papers = CommonUtils.toList(paperRepo.findAll(paperIds));
+        for (Paper paper : papers) {
+            List<PaperDetailUnit> units = paperDetailUnitRepo.findByPaper(paper);
+            if (units.size() > 0) {
+                return msg = "试卷里面还有小题,不能删除";
+            }
+
+        }
+        paperDetailService.deletePaperDetailsByPapers(papers);
+        paperRepo.delete(papers);
+        msg = "success";
+        return msg;
+
+    }
+
+    /**
+     * 批量通过试卷
+     *
+     * @param paperIds
+     */
+    public void passPapers(List<String> paperIds) {
+        List<Paper> papers = CommonUtils.toList(paperRepo.findAll(paperIds));
+        papers.stream().forEach(paper -> {
+            paper.setPaperStatus(PaperStatus.PASS);
+        });
+        paperRepo.save(papers);
+    }
+
+    /**
+     * 批量不通过试卷
+     *
+     * @param paperIds
+     */
+    public void noPassPapers(List<String> paperIds) {
+        List<Paper> papers = CommonUtils.toList(paperRepo.findAll(paperIds));
+        papers.stream().forEach(paper -> {
+            paper.setPaperStatus(PaperStatus.NOPASS);
+        });
+        paperRepo.save(papers);
+    }
+
+    /**
+     * 批量待审核试卷
+     *
+     * @param paperIds
+     */
+    public void backPapers(List<String> paperIds) {
+        List<Paper> papers = CommonUtils.toList(paperRepo.findAll(paperIds));
+        papers.stream().forEach(paper -> {
+            paper.setPaperStatus(PaperStatus.DRAFT);
+        });
+        paperRepo.save(papers);
+    }
+
+    /**
+     * 初始化导出试卷DTO
+     *
+     * @param id
+     * @return
+     */
+    public PaperExp getPaperDto(String id) {
+
+        // 获取paper
+        Paper paper = paperRepo.findOne(id);
+        // 创建paperDto
+        PaperExp paperExp = BeanCopierUtil.copyProperties(paper, PaperExp.class);
+        // 获取大题
+        List<PaperDetail> paperDetails = paperDetailRepo.findByPaper(paper);
+        List<PaperDetailExp> paperDetailExps = BeanCopierUtil.copyPropertiesOfList(paperDetails, PaperDetailExp.class);
+        paperExp.setPaperDetails(paperDetailExps);
+
+        // 封装小题
+        for (int i = 0; i < paperDetailExps.size(); i++) {
+            List<PaperDetailUnit> paperDetailUnits = paperDetailUnitRepo.findByPaperDetail(paperDetails.get(i));
+            if (paperDetailUnits != null && paperDetailUnits.size() > 0) {
+                List<PaperDetailUnitExp> paperDetailUnitExps = BeanCopierUtil.copyPropertiesOfList(paperDetailUnits,
+                        PaperDetailUnitExp.class);
+                paperDetailExps.get(i).setPaperDetailUnits(paperDetailUnitExps);
+            } else {
+                paperDetailExps.get(i).setUnitCount(0);
+            }
+
+        }
+        // 初始化试卷内容
+        initPaper(paperExp);
+
+        return paperExp;
+    }
+
+    /**
+     * 初始化试卷内容(增加序号)
+     *
+     * @param paperExp
+     */
+    public void initPaper(PaperExp paperExp) {
+        if (paperExp.getPaperDetails() == null || paperExp.getPaperDetails().size() == 0) {
+            return;
+        }
+        int mainNum = 0;
+        int subNum = 0;
+        Collections.sort(paperExp.getPaperDetails());
+        for (PaperDetailExp paperDetail : paperExp.getPaperDetails()) {
+            // 大题序号
+            paperDetail.setCnNum(CommonUtils.toCHNum(paperDetail.getNumber()));
+            paperDetail.setNumber(++mainNum);
+            if (paperDetail.getPaperDetailUnits() == null || paperDetail.getPaperDetailUnits().size() == 0) {
+                return;
+            }
+            // 小题序号
+            for (PaperDetailUnitExp paperDetailUnit : paperDetail.getPaperDetailUnits()) {
+
+                quesService.formatQuesUnit(paperDetailUnit.getQuestion());
+
+                List<Question> subQuesList = paperDetailUnit.getQuestion().getSubQuestions();
+                // 套题序号
+                if (subQuesList != null && subQuesList.size() > 0) {
+                    for (Question subQues : subQuesList) {
+                        Map<String, String> params = new HashMap<String, String>();
+                        params.put("number", String.valueOf(++subNum));
+                        subQues.setQuesParams(params);
+                        quesService.formatQuesUnit(subQues);
+                    }
+                } else {
+                    paperDetailUnit.setNumber(++subNum);
+                }
+            }
+        }
+    }
+
+    /**
+     * 格式化查询条件
+     *
+     * @param paperSearchInfo
+     */
+    public void formatPaperSearchInfo(PaperSearchInfo paperSearchInfo) {
+        if (StringUtils.isEmpty(paperSearchInfo.getCourseNo())) {
+            paperSearchInfo.setCourseNo(null);
+        }
+        if (StringUtils.isEmpty(paperSearchInfo.getCreateTime())) {
+            paperSearchInfo.setCreateTime(null);
+        }
+        if (StringUtils.isEmpty(paperSearchInfo.getCreator())) {
+            paperSearchInfo.setCreator(null);
+        }
+        if (StringUtils.isEmpty(paperSearchInfo.getName())) {
+            paperSearchInfo.setName(null);
+        }
+    }
+
+    /**
+     * 填充大题小题数量与分数
+     *
+     * @param paper
+     */
+    public void formatPaper(Paper paper) {
+        List<PaperDetail> paperDetails = paperDetailRepo.findByPaper(paper);
+        // 计算试卷总分
+        List<PaperDetailUnit> paperDetailUnitAll = paperDetailUnitRepo.findByPaper(paper);
+        double totalScore = 0;
+        for (PaperDetailUnit unit : paperDetailUnitAll) {
+            if (unit.getScore() != null) {
+                totalScore += unit.getScore();
+            }
+
+        }
+        // 计算各大题总分
+        for (PaperDetail paperDetail : paperDetails) {
+            List<PaperDetailUnit> paperDetailUnits = paperDetailUnitRepo.findByPaperDetail(paperDetail);
+            Collections.sort(paperDetailUnits);
+            if (paperDetailUnits.size() > 0) {
+                int count = 0;
+                double score = 0;
+                int nestQusNum = 0;
+                for (PaperDetailUnit unit : paperDetailUnits) {
+                    if (unit.getScore() != null) {
+                        score += unit.getScore();
+                    }
+                    if (unit.getQuestion().getSubQuestions() != null
+                            && unit.getQuestion().getSubQuestions().size() > 0) {
+                        nestQusNum += unit.getQuestion().getSubQuestions().size() - 1;
+                    }
+
+                }
+                count = paperDetailUnits.size() + nestQusNum;
+                paperDetail.setScore(score);
+                paperDetail.setUnitCount(count);
+            } else {
+                paperDetail.setScore(0d);
+            }
+        }
+        paper.setUnitCount(paperDetailUnitAll.size());
+        paper.setPaperDetailCount(paperDetails.size());
+        paper.setTotalScore(totalScore);
+        paperDetailRepo.save(paperDetails);
+        paperRepo.save(paper);
+    }
+
+    /**
+     * 先备份准备删掉的试题,然后再删掉
+     *
+     * @param questionId
+     * @return
+     */
+    public List<String> deleteImportQuestionById(String questionId) {
+        Question ques = quesRepo.findOne(questionId);
+        List<PaperDetailUnit> pdus = CommonUtils.toList(paperDetailUnitRepo.findByQuestion(ques));
+        List<String> paperNames = new ArrayList<String>();
+        List<PaperDetailUnit> needPdus = new ArrayList<PaperDetailUnit>();// 需要删除的小题
+        List<Paper> papers = new ArrayList<Paper>();
+        for (PaperDetailUnit pdu : pdus) {
+            if (PaperType.GENERATE == pdu.getPaper().getPaperType()) {
+                paperNames.add(pdu.getPaper().getName());
+                needPdus.add(pdu);
+                if (!papers.contains(pdu.getPaper())) {
+                    papers.add(pdu.getPaper());
+                }
+
+            }
+        }
+        if (paperNames.size() == 0) {// 此试题没有被组卷调用,则可以删除此试题
+            paperDetailUnitRepo.delete(needPdus);
+            quesBakRepo.save(BeanCopierUtil.copyProperties(ques, QuestionBak.class));
+            quesRepo.delete(ques);
+            for (Paper paper : papers) {
+                formatPaper(paper);
+            }
+
+        }
+        return paperNames;
+    }
+
+    /**
+     * 向试卷中插入一个试题
+     *
+     * @param paperId
+     * @param paperDetailId
+     * @return
+     */
+    public Paper insertQuestionToPaper(String paperId, String paperDetailId, Question question, AccessUser user) {
+        question.setOrgId(user.getOrgId().toString());
+        quesService.updateQuesWord(question);
+        question = quesRepo.save(question);
+        Paper paper = paperRepo.findOne(paperId);
+        PaperDetail pd = paperDetailRepo.findOne(paperDetailId);
+        PaperDetailUnit pdu = new PaperDetailUnit();
+        List<PaperDetailUnit> pdus = paperDetailUnitRepo.findByPaperDetail(pd);
+        pdu.setPaper(paper);
+        pdu.setQuestionType(question.getQuestionType());
+        pdu.setQuestion(question);
+        pdu.setCreateTime(CommonUtils.getCurDateTime());
+        pdu.setPaperDetail(pd);
+        pdus.add(pdu);
+        Collections.sort(pdus);
+        pdu.setNumber(pdus.indexOf(pdu) + 1);
+        pdu.setScore(0d);
+        paperDetailUnitRepo.save(pdu);
+        formatPaper(paper);
+        return paper;
+
+    }
+
+    /**
+     * 获取试题所的试卷名称
+     *
+     * @param questionId
+     * @return
+     */
+    public List<String> getPaperNamesByQuestionId(String questionId) {
+        List<String> paperNames = new ArrayList<String>();
+        List<PaperDetailUnit> pdus = paperDetailUnitRepo.findByQuestion(quesRepo.findOne(questionId));
+        for (PaperDetailUnit pdu : pdus) {
+            paperNames.add(pdu.getPaper().getName());
+        }
+        return paperNames;
+
+    }
+
+    public Page<Question> listQuestionforSelect(String paperId, int curPage, int pageSize, QuesStructType quesType) {
+        Set<String> selectedIds = new HashSet<>();
+        Paper paper = paperRepo.findOne(paperId);
+        // QuestionSearchCondition ques = new QuestionSearchCondition();
+        // if (quesType != null) {
+        // ques.setQuestionType(quesType);
+        // }
+        // Map<String, String> quesParams = new HashMap<String, String>();
+        // quesParams.put("courseName", paper.getCourseName());
+        // ques.setQuesParams(quesParams);
+        List<PaperDetailUnit> pdus = paperDetailUnitRepo.findByPaper(paper);
+        for (PaperDetailUnit pdu : pdus) {
+            selectedIds.add(pdu.getQuestion().getId());
+        }
+        // Page<Question> allQuestions = quesService.findAll(ques, curPage,
+        // pageSize);
+        // Iterator<Question> que = allQuestions.iterator();
+        // while (que.hasNext()) {
+        // if (selectedIds.contains(que.next().getId())) {
+        // que.remove();
+        // }
+        // }
+        return quesService.findByIdExclude(selectedIds, paper.getCourseNo(), quesType, curPage, pageSize);
+    }
+
+    public Paper selectQuestionsToPaper(String paperId, String paperDetailId, List<Question> questions) {
+        Paper paper = paperRepo.findOne(paperId);
+        PaperDetail pd = paperDetailRepo.findOne(paperDetailId);
+        List<PaperDetailUnit> pdus = paperDetailUnitRepo.findByPaperDetail(pd);
+        List<PaperDetailUnit> saveUnits = new ArrayList<PaperDetailUnit>();
+        for (Question ques : questions) {
+            PaperDetailUnit pdu = new PaperDetailUnit();
+            pdu.setPaper(paper);
+            pdu.setQuestionType(ques.getQuestionType());
+            pdu.setQuestion(ques);
+            pdu.setCreateTime(CommonUtils.getCurDateTime());
+            pdu.setPaperDetail(pd);
+            pdu.setScore(0d);
+            pdus.add(pdu);
+            saveUnits.add(pdu);
+        }
+        Collections.sort(pdus);
+        for (int i = 0; i < saveUnits.size(); i++) {
+            saveUnits.get(i).setNumber(pdus.indexOf(saveUnits.get(i)) + 1);
+        }
+
+        paperDetailUnitRepo.save(saveUnits);
+        formatPaper(paper);
+        return paper;
+    }
+
+    public String checkPaperName(String paperName, String orgId) {
+        String msg = null;
+        Paper paperTemp = new Paper();
+        paperTemp.setName(paperName);
+        paperTemp.setOrgId(orgId);
+        Paper paper = paperRepo.findOne(Example.of(paperTemp));
+        if (paper != null) {
+            msg = "试卷名称重复,请重新命名";
+        }
+        return msg;
+
+    }
+
+}

+ 64 - 0
cqb-paper/src/main/java/com/qmth/cqb/paper/web/ExamPaperController.java

@@ -0,0 +1,64 @@
+package com.qmth.cqb.paper.web;
+
+import io.swagger.annotations.ApiOperation;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.collections4.map.HashedMap;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import com.qmth.cqb.paper.model.ExamPaper;
+import com.qmth.cqb.paper.model.Paper;
+import com.qmth.cqb.paper.service.ExamPaperService;
+
+/**
+ * @author  	chenken
+ * @date    	2017年4月17日 上午10:40:20
+ * @company 	QMTH
+ * @description ExamPaperController.java
+ */
+@Controller
+@RequestMapping("${api_cqb}/")
+public class ExamPaperController {
+	
+	@Autowired
+	private ExamPaperService examPaperService;
+	
+	@ApiOperation(value = "根据考试ID和课程代码获取卷库考试试卷,按试卷类型分组"
+				, notes = "根据考试ID和课程代码获取卷库考试试卷,按试卷类型分组")
+    @GetMapping(value = "/examPaper/listByGroupCode/{examId}/{courseCode}")
+	public ResponseEntity<Map<String, List<Paper>>> findExamPaper(@PathVariable Long examId, @PathVariable String courseCode){
+		ExamPaper condition = new ExamPaper();
+		condition.setExamId(examId);
+		condition.setCourseCode(courseCode);
+		//根据考试ID和课程code取出所有试卷
+		List<ExamPaper> examPaperList = examPaperService.findExamPaperList(condition);
+		//按照试卷类型分组
+		Map<String,List<Paper>> examPaperMap = new HashedMap<String,List<Paper>>();
+		for(int i = 0;i<examPaperList.size();i++){
+			ExamPaper examPaper = examPaperList.get(i);
+			if(!examPaperMap.containsKey(examPaper.getGroupCode())){
+				if(examPaper.getPaper()!=null){
+					List<Paper> epList = new ArrayList<Paper>();
+					epList.add(examPaper.getPaper());
+					examPaperMap.put(examPaper.getGroupCode(), epList);
+				}
+			}else{
+				if(examPaper.getPaper()!=null){
+					List<Paper> epList = examPaperMap.get(examPaper.getGroupCode());
+					epList.add(examPaper.getPaper());
+				}
+			}
+		}
+		return new ResponseEntity<Map<String, List<Paper>>>(examPaperMap, HttpStatus.OK);
+	}
+}
+

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

@@ -0,0 +1,87 @@
+package com.qmth.cqb.paper.web;
+
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+
+import io.swagger.annotations.ApiOperation;
+
+import org.apache.commons.collections4.map.HashedMap;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import cn.com.qmth.examcloud.common.uac.entity.AccessUser;
+
+import com.qmth.cqb.paper.model.ExtractConfig;
+import com.qmth.cqb.paper.service.ExtractConfigService;
+
+
+/**
+ * 
+ * @author  	chenken
+ * @date    	2017年4月14日 下午6:05:37
+ * @company 	QMTH
+ * @description ExtractConfigController.java
+ */
+@Controller
+@RequestMapping("${api_cqb}/")
+public class ExtractConfigController {
+	@Autowired
+	private ExtractConfigService extractConfigService;
+	
+	@ApiOperation(value = "根据考试ID和课程ID获取调卷规则", notes = "根据考试ID和课程ID获取调卷规则")
+    @GetMapping(value = "/extractConfig/{examId}/{courseCode}")
+	public ResponseEntity<ExtractConfig> findExtractConfig(@PathVariable Long examId,@PathVariable String courseCode){
+		ExtractConfig condition = new ExtractConfig();
+		condition.setExamId(examId);
+		condition.setCourseCode(courseCode);
+		ExtractConfig extractConfig = extractConfigService.findConfig(condition);
+		return new ResponseEntity<ExtractConfig>(extractConfig,HttpStatus.OK);
+	}
+	
+	@ApiOperation(value = "根据ID获取调卷规则", notes = "根据ID获取调卷规则")
+    @GetMapping(value = "/extractConfig/{id}")
+	public ResponseEntity<ExtractConfig> findExtractConfigById(@PathVariable String id){
+		ExtractConfig extractConfig = extractConfigService.findConfigById(id);
+		return new ResponseEntity<ExtractConfig>(extractConfig,HttpStatus.OK);
+	} 
+	
+	@ApiOperation(value = "保存调卷规则", notes = "保存调卷规则")
+    @PutMapping(value = "/extractConfig")
+	public Map<String,Object> saveExtractConfig(HttpServletRequest request,@RequestBody ExtractConfig extractConfig){
+		Map<String,Object> paramsMap = new HashedMap<String,Object>();
+		try{
+			AccessUser user = (AccessUser) request.getAttribute("accessUser");
+			extractConfig.setOrgId(user.getOrgId()+"");
+			extractConfigService.saveExtractConfig(extractConfig);
+			paramsMap.put("errMsg", "保存成功");
+			paramsMap.put("status", "success");
+		}catch(Exception e){
+			paramsMap.put("errMsg", "保存失败");
+			paramsMap.put("status", "failed");
+		}
+		return paramsMap;
+	}
+	
+	@ApiOperation(value = "根据调卷规则生成试卷", notes = "根据调卷规则生成试卷")
+    @PutMapping(value = "/makePaperByConfig")
+	public Map<String,Object> makePaperByConfig(String id){
+		Map<String,Object> paramsMap = new HashedMap<String,Object>();
+		try{
+			extractConfigService.makePaperByConfig(id);
+			paramsMap.put("errMsg", "试卷生成成功");
+			paramsMap.put("status", "success");
+		}catch(Exception e){
+			paramsMap.put("errMsg", "试卷生成失败");
+			paramsMap.put("status", "failed");
+		}
+		return paramsMap;
+	}
+}	

+ 14 - 15
cqb-paper/src/main/java/com/qmth/cqb/paper/web/ImportPaperController.java

@@ -5,6 +5,7 @@ import java.util.HashMap;
 import java.util.Map;
 
 import javax.servlet.http.HttpServletRequest;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -31,6 +32,8 @@ import io.swagger.annotations.ApiOperation;
 @RequestMapping("${api_cqb}/")
 public class ImportPaperController {
 
+    protected static final Logger log = LoggerFactory.getLogger(ImportPaperController.class);
+
     @Autowired
     ImportPaperService importPaperService;
 
@@ -49,15 +52,13 @@ public class ImportPaperController {
      */
     @ApiOperation(value = "导入试卷", notes = "导入试卷")
     @PostMapping(value = "/importPaper")
-    public ResponseEntity importPaper(HttpServletRequest request, 
-                                        @RequestParam String paperName,
-                                        @RequestParam String courseNo, 
-                                        @RequestParam String courseName,
-                                        @RequestParam("file") CommonsMultipartFile file) {
+    public ResponseEntity importPaper(HttpServletRequest request, @RequestParam String paperName,
+            @RequestParam String courseNo, @RequestParam String courseName,
+            @RequestParam("file") CommonsMultipartFile file) {
         AccessUser user = (AccessUser) request.getAttribute("accessUser");
         log.info("导入开始");
         File tempFile = importPaperService.getUploadFile(file);
-        String returnStr = importPaperService.ImportPaper(paperName, courseNo, courseName, user,tempFile);
+        String returnStr = importPaperService.ImportPaper(paperName, courseNo, courseName, user, tempFile);
         log.info("导入结束");
         if (returnStr.equals("success")) {
             return new ResponseEntity(returnStr, HttpStatus.OK);
@@ -66,23 +67,21 @@ public class ImportPaperController {
             map.put("errorMsg", returnStr);
             return new ResponseEntity(map, HttpStatus.INTERNAL_SERVER_ERROR);
         }
-        // return returnStr;
     }
 
     /**
-     * 新增一张空白试卷
+     * 新增试卷
      * 
-     * @param paper
+     * @param courseNo
+     * @param paperName
      * @return
      */
     @ApiOperation(value = "保存导入类型空白试卷", notes = "保存导入类型空白试卷")
     @PostMapping(value = "/importPaper/saveBlankPaper/{courseNo}/{courseName}/{paperName}")
-    public ResponseEntity saveBlankPaper(HttpServletRequest request,
-                                        @PathVariable String courseNo,
-                                        @PathVariable String courseName,
-                                        @PathVariable String paperName) {
-        AccessUser user = (AccessUser) request.getAttribute("accessUser");      
-        Map<String,Object> returnMap = importPaperService.saveBlankPaper(courseNo, courseName,paperName,user);
+    public ResponseEntity saveBlankPaper(HttpServletRequest request, @PathVariable String courseNo,
+            @PathVariable String courseName, @PathVariable String paperName) {
+        AccessUser user = (AccessUser) request.getAttribute("accessUser");
+        Map<String, Object> returnMap = importPaperService.saveBlankPaper(courseNo, courseName, paperName, user);
         if (returnMap.get("msg").equals("success")) {
             return new ResponseEntity(returnMap, HttpStatus.OK);
         } else {

+ 1 - 1
cqb-starter/src/main/resources/application-dev.properties

@@ -1,3 +1,3 @@
 spring.data.mongodb.uri=mongodb://192.168.1.99:27017/comm-ques-bank
 spring.data.mongodb.grid-fs-database=comm-ques-bank
-eureka.client.serviceUrl.defaultZone=http://192.168.1.88:1111/eureka/
+eureka.client.serviceUrl.defaultZone=http://192.168.1.161:1111/eureka/

+ 2 - 2
cqb-starter/src/main/resources/application-test.properties

@@ -1,3 +1,3 @@
-spring.data.mongodb.uri=mongodb://192.168.1.99:27017/comm-ques-bank
-spring.data.mongodb.grid-fs-database=comm-ques-bank
+spring.data.mongodb.uri=mongodb://192.168.1.74:27017/comm-ques-bank
+spring.data.mongodb.grid-fs-database=comm-ques-bank
 eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/

+ 17 - 17
cqb-starter/src/main/resources/log4j2.xml

@@ -1,18 +1,18 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Configuration status="WARN">
-    <Appenders>
-        <Console name="Console" target="SYSTEM_OUT" follow="true">
-            <PatternLayout>
-                <pattern>%d %p %C{1.} [%t] %m%n</pattern>
-            </PatternLayout>
-        </Console>
-    </Appenders>
-    <Loggers>
-        <!-- 输出info级别信息 -->
-        <Root level="info">
-            <AppenderRef ref="Console" />
-        </Root>
-        <Logger name="org.docx4j" level="off" />
-
-    </Loggers>
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration status="WARN">
+    <Appenders>
+        <Console name="Console" target="SYSTEM_OUT" follow="true">
+            <PatternLayout charset="UTF-8">
+                <pattern>%d %p %C{1.} [%t] %m%n</pattern>
+            </PatternLayout>
+        </Console>
+    </Appenders>
+    <Loggers>
+        <!-- 输出info级别信息 -->
+        <Root level="info">
+            <AppenderRef ref="Console" />
+        </Root>
+        <Logger name="org.docx4j" level="debug" />
+
+    </Loggers>
 </Configuration>

+ 255 - 255
cqb-starter/src/test/java/com/qmth/cqb/AppTest.java

@@ -1,255 +1,255 @@
-package com.qmth.cqb;
-
-import com.google.gson.Gson;
-import com.qmth.cqb.paper.dao.*;
-import com.qmth.cqb.paper.model.*;
-import com.qmth.cqb.paper.service.ExportPaperService;
-import com.qmth.cqb.paper.service.ImportPaperService;
-import com.qmth.cqb.paper.service.PaperDetailUnitService;
-import com.qmth.cqb.question.dao.QuesRepo;
-import com.qmth.cqb.question.model.QuesOption;
-import com.qmth.cqb.question.model.Question;
-import com.qmth.cqb.question.model.QuestionType;
-import com.qmth.cqb.utils.GridFSUtil;
-import com.qmth.cqb.utils.enums.ExtractPolicy;
-import com.qmth.cqb.utils.enums.PaperType;
-import cn.com.qmth.examcloud.common.dto.question.enums.QuesStructType;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.util.HashMap;
-import java.util.List;
-
-import com.qmth.cqb.utils.word.DocxProcessUtil;
-import org.apache.log4j.Logger;
-import org.docx4j.Docx4J;
-import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
-import org.junit.Assert;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.PageRequest;
-import org.springframework.test.context.junit4.SpringRunner;
-
-import java.util.ArrayList;
-import java.util.Map;
-
-/**
- * Unit test for simple App.
- */
-@RunWith(SpringRunner.class)
-@SpringBootTest
-public class AppTest {
-    protected final Logger log = Logger.getLogger(AppTest.class);
-
-    @Autowired
-    QuesRepo quesRepo;
-
-    @Autowired
-    PaperRepo paperRepo;
-
-    @Autowired
-    PaperDetailRepo paperDetailRepo;
-
-    @Autowired
-    PaperDetailUnitRepo paperDetailUnitRepo;
-
-    @Autowired
-    GridFSUtil gridFSUtil;
-
-    @Autowired
-    ExamPaperRepo examPaperRepo;
-
-    @Autowired
-    ExtractConfigRepo extractConfigRepo;
-
-    @Autowired
-    ImportPaperService importPaperService;
-
-    @Autowired
-    ExportPaperService exportPaperService;
-
-    @Autowired
-    Gson gson;
-
-    @Autowired
-    PaperDetailUnitService paperDetailUnitService;
-
-    @Test
-    public void testGridFs() throws FileNotFoundException {
-        String fileName = "testXml";
-        String filePath = "/Users/songyue/Desktop/"+fileName+".xml";
-        FileInputStream fileInputStream = new FileInputStream(new File(filePath));
-        gridFSUtil.save(fileInputStream,fileName);
-        gridFSUtil.getByFileName(fileName);
-    }
-
-    @Test
-    public void testQuestion(){
-        Question question = new Question();
-        question.setQuesBody("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"><html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" /><style>.wordTd_disabled{border:solid windowtext 1pt;padding:0cm 5.4pt 0cm 5.4pt;} p{white-space:sWrap;word-wrap:break-word;} span{white-space:sWrap;word-wrap:break-word;}</style></head><body><p style=\"text-align:both;\"><span style=\"color:#000000;font-size:10pt;font-family:Times New Roman;\"><span style=\"font-style:normal;\"><span style=\"font-weight:normal;\">\n" +
-                "材料在外力作用下发生形变(套题题干)。\n" +
-                "</span></span></span></p></body></html>");
-        QuestionType questionType = new QuestionType();
-        questionType.setName("阅读理解");
-        questionType.setQuesType(QuesStructType.NESTED_ANSWER_QUESTION);
-        question.setQuestionType(QuesStructType.NESTED_ANSWER_QUESTION);
-        List<Question> subquestionList = new ArrayList<Question>();
-
-
-        for(int i=0;i < 10;i++){
-            Question subquestion = new Question();
-            subquestion.setQuesBody("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"><html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" /><style>.wordTd_disabled{border:solid windowtext 1pt;padding:0cm 5.4pt 0cm 5.4pt;} p{white-space:sWrap;word-wrap:break-word;} span{white-space:sWrap;word-wrap:break-word;}</style></head><body><p style=\"text-align:both;\"><span style=\"color:#000000;font-size:10pt;font-family:Times New Roman;\"><span style=\"font-style:normal;\"><span style=\"font-weight:normal;\">\n" +
-                    "材料在外力作用下发生形变,当外力撤消后能恢复原来大小和形状的性质称为(小题题干"+i+")。\n" +
-                    "</span></span></span></p></body></html>");
-            subquestion.setQuesAnswer("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"><html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" /><style>.wordTd_disabled{border:solid windowtext 1pt;padding:0cm 5.4pt 0cm 5.4pt;} p{white-space:sWrap;word-wrap:break-word;} span{white-space:sWrap;word-wrap:break-word;}</style></head><body><p style=\"text-align:both;\"><span style=\"color:#000000;font-size:10pt;font-family:Times New Roman;\"><span style=\"font-style:normal;\"><span style=\"font-weight:normal;\">\n" +
-                    "B\n" +
-                    "</span></span></span></p><p style=\"text-align:both;\"><br/></p></body></html>");
-            QuesOption quesOption1 = new QuesOption();
-            quesOption1.setOptionBody("A.12312312313");
-            QuesOption quesOption2 = new QuesOption();
-            quesOption2.setOptionBody("B.34534534545");
-            List<QuesOption> quesOptionList = new ArrayList<QuesOption>();
-            quesOptionList.add(quesOption1);
-            quesOptionList.add(quesOption2);
-            subquestion.setQuesOptions(quesOptionList);
-            QuestionType questionType1 = new QuestionType();
-            questionType1.setQuesType(QuesStructType.SINGLE_ANSWER_QUESTION);
-            subquestion.setQuestionType(QuesStructType.SINGLE_ANSWER_QUESTION);
-            subquestionList.add(subquestion);
-        }
-        question.setSubQuestions(subquestionList);
-        quesRepo.save(question);
-    }
-
-    @Test
-    public void testPaper(){
-        paperRepo.deleteAll();
-        paperDetailRepo.deleteAll();
-        paperDetailUnitRepo.deleteAll();
-
-        Paper paper =  new Paper();
-        paper.setName("测试试卷");
-        paper.setPaperDetailCount(1);
-        paper.setTitle("测试试卷");
-        PaperDetail paperDetail = new PaperDetail();
-        paperDetail.setName("选择题");
-        paperDetail.setScore((double)20);
-        paperDetail.setNumber(1);
-        paperDetail.setPaper(paper);
-        QuestionType questionType1 = new QuestionType();
-        questionType1.setName("单项选择题");
-        questionType1.setQuesType(QuesStructType.SINGLE_ANSWER_QUESTION);
-        paperDetail.setUnitCount(3);
-
-        paperRepo.save(paper);
-        paperDetailRepo.save(paperDetail);
-
-
-        List<Question> questionList = quesRepo.findAll();
-        int i = 0;
-        for(Question ques:questionList){
-            PaperDetailUnit paperDetailUnit = new PaperDetailUnit();
-            paperDetailUnit.setQuestionType(ques.getQuestionType());
-            paperDetailUnit.setNumber(i);
-            paperDetailUnit.setPaper(paper);
-            paperDetailUnit.setPaperDetail(paperDetail);
-            paperDetailUnit.setScore((double)10);
-            paperDetailUnit.setQuestion(ques);
-            i++;
-            paperDetailUnitRepo.save(paperDetailUnit);
-        }
-    }
-
-    @Test
-    public void testExtract(){
-        extractConfigRepo.deleteAll();
-        examPaperRepo.deleteAll();
-        ExamPaper examPaper = new ExamPaper();
-        examPaper.setExamId((long)1);
-        examPaper.setCourseCode("1");
-        examPaper.setExtractCount(1);
-        examPaper.setGroupCode("1");
-        examPaper.setPaperId("58b3e0b06def240e05b0c0e1");
-        examPaperRepo.save(examPaper);
-
-        ExtractConfig extractConfig = new ExtractConfig();
-        extractConfig.setExamId((long)1);
-        extractConfig.setCourseCode("1");
-        extractConfig.setPolicy(ExtractPolicy.RANDOM_POLICY);
-        extractConfigRepo.save(extractConfig);
-    }
-
-    @Test
-    public void testImport(){
-        paperRepo.deleteAll();
-        paperDetailRepo.deleteAll();
-        quesRepo.deleteAll();
-        paperDetailUnitRepo.deleteAll();
-//        String inputFilePath = "/Users/songyue/docxImport/ceshi2.docx";
-//        try {
-//            File inputFile = new File(inputFilePath);
-//            FileInputStream inputStream = new FileInputStream(inputFile);
-//            System.out.println(inputFilePath);
-//            long startTime = System.currentTimeMillis();    //获取开始时间
-//
-//            String errorInfo = importPaperService.ImportPaper("",inputFile);
-//            System.out.println("errorInfo:"+errorInfo);
-//
-//            long endTime = System.currentTimeMillis();    //获取结束时间
-//
-//            System.out.println("程序运行时间:" + (endTime - startTime)/1000 + "s");    //输出程序运行时间
-//
-//
-//
-//        } catch (Exception e) {
-//            e.printStackTrace();
-//        }
-
-
-    }
-
-    @Test
-    public void testExport()throws Exception{
-        long startTime = System.currentTimeMillis();    //获取开始时间
-        exportPaperService.exportPaper("58d2249dcca40392c5782322");
-        long endTime = System.currentTimeMillis();    //获取结束时间
-        System.out.println("程序运行时间:" + (endTime - startTime)/1000 + "s");    //输出程序运行时间
-    }
-
-    @Test
-    public void testImport1(){
-        String inputFilePath = "/Users/songyue/docxImport/ceshi2.docx";
-        String outFilePath = "/Users/songyue/docxImport/ceshi11111.docx";
-        try {
-            File inputFile = new File(inputFilePath);
-            FileInputStream inputStream = new FileInputStream(inputFile);
-            System.out.println(inputFilePath);
-
-            WordprocessingMLPackage wordMLPackage = Docx4J.load(inputFile);
-
-            DocxProcessUtil.initPkgImage(wordMLPackage);
-            Docx4J.save(wordMLPackage,new FileOutputStream(outFilePath));
-
-
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    @Test
-    public void testCourse(){
-        Map<String,String> params = new HashMap<String,String>();
-        params.put("courseNo","03013750");
-        params.put("courseName","专升本《合同法》");
-//        List<Paper> papers = paperRepo.findByParams(params);
-        Page<Paper> papers = paperRepo.findByPaperType(PaperType.IMPORT,new PageRequest(0,10));
-        System.out.println(papers.getTotalElements());
-//        System.out.println(gson.toJson(papers));
-    }
-
-}
+package com.qmth.cqb;
+
+import com.google.gson.Gson;
+import com.qmth.cqb.paper.dao.*;
+import com.qmth.cqb.paper.model.*;
+import com.qmth.cqb.paper.service.ExportPaperService;
+import com.qmth.cqb.paper.service.ImportPaperService;
+import com.qmth.cqb.paper.service.PaperDetailUnitService;
+import com.qmth.cqb.question.dao.QuesRepo;
+import com.qmth.cqb.question.model.QuesOption;
+import com.qmth.cqb.question.model.Question;
+import com.qmth.cqb.question.model.QuestionType;
+import com.qmth.cqb.utils.GridFSUtil;
+import com.qmth.cqb.utils.enums.ExtractPolicy;
+import com.qmth.cqb.utils.enums.PaperType;
+import cn.com.qmth.examcloud.common.dto.question.enums.QuesStructType;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.util.HashMap;
+import java.util.List;
+
+import com.qmth.cqb.utils.word.DocxProcessUtil;
+import org.apache.log4j.Logger;
+import org.docx4j.Docx4J;
+import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.util.ArrayList;
+import java.util.Map;
+
+/**
+ * Unit test for simple App.
+ */
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class AppTest {
+    protected final Logger log = Logger.getLogger(AppTest.class);
+
+    @Autowired
+    QuesRepo quesRepo;
+
+    @Autowired
+    PaperRepo paperRepo;
+
+    @Autowired
+    PaperDetailRepo paperDetailRepo;
+
+    @Autowired
+    PaperDetailUnitRepo paperDetailUnitRepo;
+
+    @Autowired
+    GridFSUtil gridFSUtil;
+
+    @Autowired
+    ExamPaperRepo examPaperRepo;
+
+    @Autowired
+    ExtractConfigRepo extractConfigRepo;
+
+    @Autowired
+    ImportPaperService importPaperService;
+
+    @Autowired
+    ExportPaperService exportPaperService;
+
+    @Autowired
+    Gson gson;
+
+    @Autowired
+    PaperDetailUnitService paperDetailUnitService;
+
+    @Test
+    public void testGridFs() throws FileNotFoundException {
+        String fileName = "testXml";
+        String filePath = "/Users/songyue/Desktop/"+fileName+".xml";
+        FileInputStream fileInputStream = new FileInputStream(new File(filePath));
+        gridFSUtil.save(fileInputStream,fileName);
+        gridFSUtil.getByFileName(fileName);
+    }
+
+    @Test
+    public void testQuestion(){
+        Question question = new Question();
+        question.setQuesBody("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"><html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" /><style>.wordTd_disabled{border:solid windowtext 1pt;padding:0cm 5.4pt 0cm 5.4pt;} p{white-space:sWrap;word-wrap:break-word;} span{white-space:sWrap;word-wrap:break-word;}</style></head><body><p style=\"text-align:both;\"><span style=\"color:#000000;font-size:10pt;font-family:Times New Roman;\"><span style=\"font-style:normal;\"><span style=\"font-weight:normal;\">\n" +
+                "材料在外力作用下发生形变(套题题干)。\n" +
+                "</span></span></span></p></body></html>");
+        QuestionType questionType = new QuestionType();
+        questionType.setName("阅读理解");
+        questionType.setQuesType(QuesStructType.NESTED_ANSWER_QUESTION);
+        question.setQuestionType(QuesStructType.NESTED_ANSWER_QUESTION);
+        List<Question> subquestionList = new ArrayList<Question>();
+
+
+        for(int i=0;i < 10;i++){
+            Question subquestion = new Question();
+            subquestion.setQuesBody("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"><html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" /><style>.wordTd_disabled{border:solid windowtext 1pt;padding:0cm 5.4pt 0cm 5.4pt;} p{white-space:sWrap;word-wrap:break-word;} span{white-space:sWrap;word-wrap:break-word;}</style></head><body><p style=\"text-align:both;\"><span style=\"color:#000000;font-size:10pt;font-family:Times New Roman;\"><span style=\"font-style:normal;\"><span style=\"font-weight:normal;\">\n" +
+                    "材料在外力作用下发生形变,当外力撤消后能恢复原来大小和形状的性质称为(小题题干"+i+")。\n" +
+                    "</span></span></span></p></body></html>");
+            subquestion.setQuesAnswer("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"><html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" /><style>.wordTd_disabled{border:solid windowtext 1pt;padding:0cm 5.4pt 0cm 5.4pt;} p{white-space:sWrap;word-wrap:break-word;} span{white-space:sWrap;word-wrap:break-word;}</style></head><body><p style=\"text-align:both;\"><span style=\"color:#000000;font-size:10pt;font-family:Times New Roman;\"><span style=\"font-style:normal;\"><span style=\"font-weight:normal;\">\n" +
+                    "B\n" +
+                    "</span></span></span></p><p style=\"text-align:both;\"><br/></p></body></html>");
+            QuesOption quesOption1 = new QuesOption();
+            quesOption1.setOptionBody("A.12312312313");
+            QuesOption quesOption2 = new QuesOption();
+            quesOption2.setOptionBody("B.34534534545");
+            List<QuesOption> quesOptionList = new ArrayList<QuesOption>();
+            quesOptionList.add(quesOption1);
+            quesOptionList.add(quesOption2);
+            subquestion.setQuesOptions(quesOptionList);
+            QuestionType questionType1 = new QuestionType();
+            questionType1.setQuesType(QuesStructType.SINGLE_ANSWER_QUESTION);
+            subquestion.setQuestionType(QuesStructType.SINGLE_ANSWER_QUESTION);
+            subquestionList.add(subquestion);
+        }
+        question.setSubQuestions(subquestionList);
+        quesRepo.save(question);
+    }
+
+    @Test
+    public void testPaper(){
+        paperRepo.deleteAll();
+        paperDetailRepo.deleteAll();
+        paperDetailUnitRepo.deleteAll();
+
+        Paper paper =  new Paper();
+        paper.setName("测试试卷");
+        paper.setPaperDetailCount(1);
+        paper.setTitle("测试试卷");
+        PaperDetail paperDetail = new PaperDetail();
+        paperDetail.setName("选择题");
+        paperDetail.setScore((double)20);
+        paperDetail.setNumber(1);
+        paperDetail.setPaper(paper);
+        QuestionType questionType1 = new QuestionType();
+        questionType1.setName("单项选择题");
+        questionType1.setQuesType(QuesStructType.SINGLE_ANSWER_QUESTION);
+        paperDetail.setUnitCount(3);
+
+        paperRepo.save(paper);
+        paperDetailRepo.save(paperDetail);
+
+
+        List<Question> questionList = quesRepo.findAll();
+        int i = 0;
+        for(Question ques:questionList){
+            PaperDetailUnit paperDetailUnit = new PaperDetailUnit();
+            paperDetailUnit.setQuestionType(ques.getQuestionType());
+            paperDetailUnit.setNumber(i);
+            paperDetailUnit.setPaper(paper);
+            paperDetailUnit.setPaperDetail(paperDetail);
+            paperDetailUnit.setScore((double)10);
+            paperDetailUnit.setQuestion(ques);
+            i++;
+            paperDetailUnitRepo.save(paperDetailUnit);
+        }
+    }
+
+    @Test
+    public void testExtract(){
+        extractConfigRepo.deleteAll();
+        examPaperRepo.deleteAll();
+        ExamPaper examPaper = new ExamPaper();
+        examPaper.setExamId((long)1);
+        examPaper.setCourseCode("1");
+        examPaper.setExtractCount(1);
+        examPaper.setGroupCode("1");
+//        examPaper.setPaperId("58b3e0b06def240e05b0c0e1");
+        examPaperRepo.save(examPaper);
+
+        ExtractConfig extractConfig = new ExtractConfig();
+        extractConfig.setExamId((long)1);
+        extractConfig.setCourseCode("1");
+        extractConfig.setPolicy(ExtractPolicy.RANDOM_POLICY);
+        extractConfigRepo.save(extractConfig);
+    }
+
+    @Test
+    public void testImport(){
+        paperRepo.deleteAll();
+        paperDetailRepo.deleteAll();
+        quesRepo.deleteAll();
+        paperDetailUnitRepo.deleteAll();
+//        String inputFilePath = "/Users/songyue/docxImport/ceshi2.docx";
+//        try {
+//            File inputFile = new File(inputFilePath);
+//            FileInputStream inputStream = new FileInputStream(inputFile);
+//            System.out.println(inputFilePath);
+//            long startTime = System.currentTimeMillis();    //获取开始时间
+//
+//            String errorInfo = importPaperService.ImportPaper("",inputFile);
+//            System.out.println("errorInfo:"+errorInfo);
+//
+//            long endTime = System.currentTimeMillis();    //获取结束时间
+//
+//            System.out.println("程序运行时间:" + (endTime - startTime)/1000 + "s");    //输出程序运行时间
+//
+//
+//
+//        } catch (Exception e) {
+//            e.printStackTrace();
+//        }
+
+
+    }
+
+    @Test
+    public void testExport()throws Exception{
+        long startTime = System.currentTimeMillis();    //获取开始时间
+        exportPaperService.exportPaper("58d2249dcca40392c5782322");
+        long endTime = System.currentTimeMillis();    //获取结束时间
+        System.out.println("程序运行时间:" + (endTime - startTime)/1000 + "s");    //输出程序运行时间
+    }
+
+    @Test
+    public void testImport1(){
+        String inputFilePath = "/Users/songyue/docxImport/ceshi2.docx";
+        String outFilePath = "/Users/songyue/docxImport/ceshi11111.docx";
+        try {
+            File inputFile = new File(inputFilePath);
+            FileInputStream inputStream = new FileInputStream(inputFile);
+            System.out.println(inputFilePath);
+
+            WordprocessingMLPackage wordMLPackage = Docx4J.load(inputFile);
+
+            DocxProcessUtil.initPkgImage(wordMLPackage);
+            Docx4J.save(wordMLPackage,new FileOutputStream(outFilePath));
+
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void testCourse(){
+        Map<String,String> params = new HashMap<String,String>();
+        params.put("courseNo","03013750");
+        params.put("courseName","专升本《合同法》");
+//        List<Paper> papers = paperRepo.findByParams(params);
+        Page<Paper> papers = paperRepo.findByPaperType(PaperType.IMPORT,new PageRequest(0,10));
+        System.out.println(papers.getTotalElements());
+//        System.out.println(gson.toJson(papers));
+    }
+
+}

+ 114 - 0
cqb-starter/src/test/java/com/qmth/cqb/ExtractConfigServiceTest.java

@@ -0,0 +1,114 @@
+package com.qmth.cqb;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import com.qmth.cqb.paper.dao.PaperRepo;
+import com.qmth.cqb.paper.model.ExamPaper;
+import com.qmth.cqb.paper.model.ExtractConfig;
+import com.qmth.cqb.paper.model.Paper;
+import com.qmth.cqb.paper.service.ExtractConfigService;
+
+/**
+ * @author  	chenken
+ * @date    	2017年4月18日 下午3:32:25
+ * @company 	QMTH
+ * @description PaperServiceTest.java
+ */
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class ExtractConfigServiceTest {
+	
+	@Autowired
+	private PaperRepo paperRepo;
+	@Autowired
+	private ExtractConfigService extractConfigService;
+	
+	/**
+	 * 测试保存调卷规则
+	 */
+	@Test
+	public void testSaveExtractConfig(){
+		ExtractConfig extractConfig = new ExtractConfig();
+		extractConfig.setExamId(1L);
+		extractConfig.setExamName("测试考试0419");
+		extractConfig.setExamType("ONLINE");
+		extractConfig.setCourseCode("03013750");
+		extractConfig.setCourseName("测试课程0419");
+		extractConfig.setCallType("WHOLE_SET");
+		extractConfig.setScrambling_the_question_order((short)1);
+		extractConfig.setScrambling_the_option_order((short)1);
+		List<ExamPaper> examPaperList = buildExamPaper();
+		extractConfig.setExamPaperList(examPaperList);
+		extractConfigService.saveExtractConfig(extractConfig);
+	}
+	/**
+	 * 测试根据调卷规则ID生成试卷
+	 */
+	@Test
+	public void testMakePaperByConfig(){
+		extractConfigService.makePaperByConfig("58f6d77aaa9e290d805befa3");
+	}
+	
+	private List<ExamPaper> buildExamPaper(){
+		List<ExamPaper> examPaperList = new ArrayList<ExamPaper>();
+		/*******************A类型********************/
+		ExamPaper examPaper1 = new ExamPaper();
+		examPaper1.setExamId(1L);
+		examPaper1.setCourseCode("03013750");
+		examPaper1.setGroupCode("A");
+		examPaper1.setWeight(80);
+		Paper paper1 = new Paper();
+		paper1.setId("58f0a15258e31a0d7448d58c");
+		examPaper1.setPaper(paper1);
+		examPaperList.add(examPaper1);
+		ExamPaper examPaper2 = new ExamPaper();
+		examPaper2.setExamId(1L);
+		examPaper2.setCourseCode("03013750");
+		examPaper2.setGroupCode("A");
+		examPaper2.setWeight(20);
+		Paper paper2 = new Paper();
+		paper2.setId("58f42fcd58e31a025844bfff");
+		examPaper2.setPaper(paper2);
+		examPaperList.add(examPaper2);
+		/*******************B类型********************/
+		ExamPaper examPaper3 = new ExamPaper();
+		examPaper3.setExamId(1L);
+		examPaper3.setCourseCode("03013750");
+		examPaper3.setGroupCode("B");
+		examPaper3.setWeight(60);
+		Paper paper3 = new Paper();
+		paper3.setId("58f4300c58e31a025844c02f");
+		examPaper3.setPaper(paper3);
+		examPaperList.add(examPaper3);
+		ExamPaper examPaper4 = new ExamPaper();
+		examPaper4.setExamId(1L);
+		examPaper4.setCourseCode("03013750");
+		examPaper4.setGroupCode("B");
+		examPaper4.setWeight(40);
+		Paper paper4 = new Paper();
+		paper4.setId("e483c730-921e-4212-a67e-42235a0aec00");
+		examPaper4.setPaper(paper4);
+		examPaperList.add(examPaper4);
+		return examPaperList;
+	}
+	
+	public static void main(String[] args) {
+		List<String> newList = new ArrayList<String>();
+		newList.add("a");
+		newList.add("b");
+		newList.add("c");
+		newList.add("d");
+		newList.add("e");
+		Collections.shuffle(newList);
+		System.out.println(newList);
+	}
+}
+