瀏覽代碼

新增网考抽卷接口DTO的构造

gaoxing 8 年之前
父節點
當前提交
d7a447595a

+ 7 - 2
cqb-comm-utils/pom.xml

@@ -16,8 +16,13 @@
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     </properties>
 
-    <dependencies>
-
+    <dependencies>       
+         <dependency>
+            <groupId>cn.com.qmth.examcloud.common</groupId>
+            <artifactId>common-dto</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        
         <dependency>
             <groupId>com.google.code.gson</groupId>
             <artifactId>gson</artifactId>

+ 33 - 22
cqb-comm-utils/src/main/java/com/qmth/cqb/utils/CommonUtils.java

@@ -1,14 +1,18 @@
 package com.qmth.cqb.utils;
 
-import com.qmth.cqb.utils.enums.QuesStructType;
-
 import java.io.BufferedReader;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.text.SimpleDateFormat;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Properties;
 import java.util.stream.Stream;
 
+import cn.com.qmth.examcloud.common.dto.question.enums.QuesStructType;
+
 /**
  * Created by songyue on 16/12/27.
  */
@@ -16,18 +20,17 @@ public final class CommonUtils {
 
     private static final String COMMON_PROPERTIES = "common.properties";
 
-    private static final String[] CN_SMALL_NUM =
-            { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九" };
-    private static final String[] CN_BIG_NUM =
-            { "十", "百", "千", "万", "十", "百", "千", "亿", "十", "百", "千" };
+    private static final String[] CN_SMALL_NUM = { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九" };
 
+    private static final String[] CN_BIG_NUM = { "十", "百", "千", "万", "十", "百", "千", "亿", "十", "百", "千" };
 
     /**
      * 加载properties配置文件
+     * 
      * @param propertiesPath
      * @return
      */
-    public static Properties loadProperties(String propertiesPath){
+    public static Properties loadProperties(String propertiesPath) {
         InputStream inputStream = null;
         Properties properties = new Properties();
         try {
@@ -42,55 +45,61 @@ public final class CommonUtils {
 
     /**
      * 记载通用配置文件
+     * 
      * @return
      */
-    public static Properties loadCommonProperties(){
+    public static Properties loadCommonProperties() {
         return loadProperties(COMMON_PROPERTIES);
     }
 
     /**
      * 获取临时文件夹根路径
+     * 
      * @return
      */
-    public static String getTmpRootPath(){
-        return (String)loadCommonProperties().get("tmp_root_path");
+    public static String getTmpRootPath() {
+        return (String) loadCommonProperties().get("tmp_root_path");
     }
 
     /**
      * 获取当前日期字符串
+     * 
      * @return
      */
-    public static String getCurDate(){
+    public static String getCurDate() {
         return new SimpleDateFormat("yyyy-MM-dd").format(new Date());
     }
 
     /**
      * 获取当前日期时间字符串
+     * 
      * @return
      */
-    public static String getCurDateTime(){
+    public static String getCurDateTime() {
         return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
     }
 
     /**
      * 根据当前日期获取数字字符串
+     * 
      * @return
      */
-    public static String getCurNum(){
+    public static String getCurNum() {
         return new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date());
     }
 
     /**
      * 根据枚举名称获取枚举
+     * 
      * @param clazz
      * @param name
      * @param <T>
      * @return
      */
-    public static <T> T getEnum(Class<T> clazz, String name){
+    public static <T> T getEnum(Class<T> clazz, String name) {
         T[] enumConstants = clazz.getEnumConstants();
-        for(T _enum : enumConstants){
-                if(_enum.toString().equals(name)){
+        for (T _enum : enumConstants) {
+            if (_enum.toString().equals(name)) {
                 return _enum;
             }
         }
@@ -99,16 +108,17 @@ public final class CommonUtils {
 
     /**
      * 校验题型
+     * 
      * @param quesType
      * @return
      */
-    public static boolean checkQuesType(String quesType){
-        return Stream.of(QuesStructType.values()).
-                anyMatch(type -> type.getName().equals(quesType));
+    public static boolean checkQuesType(String quesType) {
+        return Stream.of(QuesStructType.values()).anyMatch(type -> type.getName().equals(quesType));
     }
 
     /**
      * 获取中文数字
+     * 
      * @param inputNum
      * @return
      */
@@ -130,6 +140,7 @@ public final class CommonUtils {
 
     /**
      * iterator转List
+     * 
      * @param <T>
      * @param iterator
      * @return
@@ -146,8 +157,8 @@ public final class CommonUtils {
     }
 
     public static void main(String[] args) {
-//        QuesStructType quesStructType = getEnum(QuesStructType.class,"单选");
-//        System.out.println(quesStructType.getName());
+        // QuesStructType quesStructType = getEnum(QuesStructType.class,"单选");
+        // System.out.println(quesStructType.getName());
         System.out.println(getCurNum());
     }
 }

+ 0 - 65
cqb-comm-utils/src/main/java/com/qmth/cqb/utils/enums/QuesStructType.java

@@ -1,65 +0,0 @@
-package com.qmth.cqb.utils.enums;
-
-public enum QuesStructType {
-	
-	SINGLE_ANSWER_QUESTION(1L,"单选",true,false),
-	MULTIPLE_ANSWER_QUESTION(2L,"多选",true,false),
-	BOOL_ANSWER_QUESTION(3L,"判断",true,false),
-	FILL_BLANK_QUESTION(4L,"填空",false,false),
-	TEXT_ANSWER_QUESTION(5L,"问答",false,false),
-	NESTED_ANSWER_QUESTION(6L,"套题",false,true);
-	
-	private Long id;
-	private String name;
-	private boolean objective;//是否是客观题
-	private boolean combline;//是否是组合题
-		
-	private QuesStructType(Long id, String name, boolean objective, boolean combline) {
-		this.id = id;
-		this.name = name;;
-		this.objective = objective;
-		this.combline = combline;
-	}
-	
-	private QuesStructType(){
-		
-	}
-
-	public Long getId() {
-		return id;
-	}
-
-	public void setId(Long id) {
-		this.id = id;
-	}
-
-	public String getName() {
-		return name;
-	}
-
-	public void setName(String name) {
-		this.name = name;
-	}
-
-	public boolean isObjective() {
-		return objective;
-	}
-
-	public void setObjective(boolean objective) {
-		this.objective = objective;
-	}
-
-	public boolean isCombline() {
-		return combline;
-	}
-
-	public void setCombline(boolean combline) {
-		this.combline = combline;
-	}
-
-	public String toString(){
-		return getName();
-	}
-	
-}
-

+ 289 - 215
cqb-comm-utils/src/main/java/com/qmth/cqb/utils/word/DocxProcessUtil.java

@@ -1,18 +1,36 @@
 package com.qmth.cqb.utils.word;
 
-import com.qmth.cqb.utils.CommonUtils;
-import com.qmth.cqb.utils.enums.QuesUnit;
-import freemarker.template.Configuration;
-import freemarker.template.Template;
-import net.sf.saxon.TransformerFactoryImpl;
-import net.sourceforge.jeuclid.LayoutContext;
-import net.sourceforge.jeuclid.context.LayoutContextImpl;
-import net.sourceforge.jeuclid.context.StyleAttributeLayoutContext;
-import net.sourceforge.jeuclid.converter.Converter;
+import java.io.BufferedWriter;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+
+import javax.xml.bind.JAXBElement;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+
 import org.apache.commons.codec.binary.Base64;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang3.RandomUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.docx4j.Docx4J;
 import org.docx4j.TraversalUtil;
@@ -34,75 +52,92 @@ import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;
 import org.docx4j.openpackaging.parts.relationships.Namespaces;
 import org.docx4j.openpackaging.parts.relationships.RelationshipsPart;
 import org.docx4j.relationships.Relationship;
-import org.docx4j.wml.*;
+import org.docx4j.wml.ContentAccessor;
+import org.docx4j.wml.Drawing;
+import org.docx4j.wml.ObjectFactory;
+import org.docx4j.wml.P;
+import org.docx4j.wml.R;
 import org.docx4j.wml.Text;
 import org.dom4j.Namespace;
 import org.dom4j.io.SAXReader;
 import org.jsoup.Jsoup;
+import org.jsoup.nodes.Element;
 import org.jsoup.select.Elements;
 import org.xml.sax.InputSource;
 
-import javax.xml.bind.JAXBElement;
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamResult;
-import javax.xml.transform.stream.StreamSource;
-import java.io.*;
-import java.util.*;
+import com.qmth.cqb.utils.CommonUtils;
+import com.qmth.cqb.utils.enums.QuesUnit;
+
+import freemarker.template.Configuration;
+import freemarker.template.Template;
+import net.sf.saxon.TransformerFactoryImpl;
+import net.sourceforge.jeuclid.LayoutContext;
+import net.sourceforge.jeuclid.context.LayoutContextImpl;
+import net.sourceforge.jeuclid.context.StyleAttributeLayoutContext;
+import net.sourceforge.jeuclid.converter.Converter;
 
 /**
- * docx处理工具类
- * Created by songyue on 17/3/10.
+ * docx处理工具类 Created by songyue on 17/3/10.
  */
 public final class DocxProcessUtil {
 
     public static final LayoutContext IMG_LAYOUT = new StyleAttributeLayoutContext(
             LayoutContextImpl.getDefaultLayoutContext(), "3em", java.awt.Color.BLACK);
+
     public static final String IMG_OUT_TYPE = "image/png";
+
     public static final String ENCODING = "utf-8";
+
     public static final String BASE64_HEADER = "data:image/png;base64,";
-    public static final String TEMP_FILE_IMP = CommonUtils.getTmpRootPath()+"docxImport/";
-    public static final String TEMP_FILE_EXP = CommonUtils.getTmpRootPath()+"docxExport/";
-    public static final String OMML2MML_XSL="OMML2MML.XSL";
-    public static final String PAPER_TEMPLATE="paper_template.ftl";
-    public static final String ANSWER_TEMPLATE="answer_template.ftl";
+
+    public static final String TEMP_FILE_IMP = CommonUtils.getTmpRootPath() + "docxImport/";
+
+    public static final String TEMP_FILE_EXP = CommonUtils.getTmpRootPath() + "docxExport/";
+
+    public static final String OMML2MML_XSL = "OMML2MML.XSL";
+
+    public static final String PAPER_TEMPLATE = "paper_template.ftl";
+
+    public static final String ANSWER_TEMPLATE = "answer_template.ftl";
+
     public static final String DOCX_SUFFIX = ".docx";
-    public static final String BODY_HEADER ="<w:body xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\">";
-    public static final String BODY_TAIL ="</w:body>";
-    public static final String REL_ID_HEADER="rld";
 
-    static{
+    public static final String BODY_HEADER = "<w:body xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\">";
+
+    public static final String BODY_TAIL = "</w:body>";
+
+    public static final String REL_ID_HEADER = "rld";
+
+    static {
         init();
     }
 
     /**
      * 初始化文件夹
      */
-    private static void init(){
+    private static void init() {
         File temp_file_exp = new File(TEMP_FILE_EXP);
         File temp_file_img = new File(TEMP_FILE_IMP);
-        //如果输出目标文件夹不存在,则创建
-        if (!temp_file_img.exists()){
+        // 如果输出目标文件夹不存在,则创建
+        if (!temp_file_img.exists()) {
             temp_file_img.mkdirs();
         }
-        if (!temp_file_exp.exists()){
+        if (!temp_file_exp.exists()) {
             temp_file_exp.mkdirs();
         }
     }
 
     /**
      * 获取段落的所有文本
+     * 
      * @param p
      * @return
      */
-    public static String getPText(P p){
+    public static String getPText(P p) {
         String returnText = "";
-        List<Object> tList = getAllElementFromObject(p,Text.class);
-        for(Object obj:tList){
-            Text text = (Text)obj;
+        List<Object> tList = getAllElementFromObject(p, Text.class);
+        for (Object obj : tList) {
+            Text text = (Text) obj;
             returnText += text.getValue();
         }
         return returnText.trim();
@@ -110,34 +145,35 @@ public final class DocxProcessUtil {
 
     /**
      * 校验段落中是否含有公式或图片
+     * 
      * @param p
      * @return
      */
-    public static boolean isNotText(P p){
-        List<Object> mathList = getAllElementFromObject(p,CTOMath.class);
-        List<Object> drawList = getAllElementFromObject(p,Drawing.class);
-        if(mathList.size() > 0 || drawList.size() > 0){
+    public static boolean isNotText(P p) {
+        List<Object> mathList = getAllElementFromObject(p, CTOMath.class);
+        List<Object> drawList = getAllElementFromObject(p, Drawing.class);
+        if (mathList.size() > 0 || drawList.size() > 0) {
             return true;
-        }else{
+        } else {
             return false;
         }
     }
 
     /**
      * 获取文档包副本(去除段落)
+     * 
      * @param wordMLPackage
      * @return
      * @throws Exception
      */
-    public static WordprocessingMLPackage getTmpPackage(WordprocessingMLPackage wordMLPackage)
-            throws Exception{
-        //添加关系样式信息
+    public static WordprocessingMLPackage getTmpPackage(WordprocessingMLPackage wordMLPackage) throws Exception {
+        // 添加关系样式信息
         Set<String> relationshipTypes = new HashSet<String>();
         relationshipTypes.add(wordMLPackage.getMainDocumentPart().getRelationshipType());
-        //深拷贝
-        WordprocessingMLPackage tmpWordMlPackage = (WordprocessingMLPackage)
-                PartialDeepCopy.process(wordMLPackage,relationshipTypes);
-        //移除所有段落
+        // 深拷贝
+        WordprocessingMLPackage tmpWordMlPackage = (WordprocessingMLPackage) PartialDeepCopy.process(wordMLPackage,
+                relationshipTypes);
+        // 移除所有段落
         initTmpPackage(tmpWordMlPackage);
 
         return tmpWordMlPackage;
@@ -145,62 +181,62 @@ public final class DocxProcessUtil {
 
     /**
      * 初始化文档包(去除所有段落)
+     * 
      * @param wordMLPackage
      * @return
      * @throws Exception
      */
-    public static void initTmpPackage(WordprocessingMLPackage wordMLPackage)
-            throws Exception{
-        //移除所有段落
+    public static void initTmpPackage(WordprocessingMLPackage wordMLPackage) throws Exception {
+        // 移除所有段落
         List<Object> contentList = wordMLPackage.getMainDocumentPart().getContent();
         contentList.removeAll(contentList);
     }
 
     /**
      * 获得段落wordml
+     * 
      * @param p
      * @return
      */
-    public static String getPWordMl(P p)throws Exception{
+    public static String getPWordMl(P p) throws Exception {
         return XmlUtils.marshaltoString(p);
     }
 
     /**
      * 转换wordMl为html
+     * 
      * @param wordMl
      * @return
      * @throws Exception
      */
-    public static String docx2Html(String wordMl,WordprocessingMLPackage wordMLPackage)
-            throws Exception{
+    public static String docx2Html(String wordMl, WordprocessingMLPackage wordMLPackage) throws Exception {
 
         initTmpPackage(wordMLPackage);
 
-        //转换wordml为完整的package对象
+        // 转换wordml为完整的package对象
         MainDocumentPart mdp = wordMLPackage.getMainDocumentPart();
         Object p = XmlUtils.unmarshalString(wordMl);
 
         mdp.getContent().add(p);
 
-        //转换公式为图片
-        replaceMath2Image(wordMLPackage,(P)p);
+        // 转换公式为图片
+        replaceMath2Image(wordMLPackage, (P) p);
 
-        //设置导出临时html参数
+        // 设置导出临时html参数
         HTMLSettings htmlSettings = Docx4J.createHTMLSettings();
         htmlSettings.setImageDirPath(TEMP_FILE_IMP + "_files");
-        htmlSettings.setImageTargetUri(TEMP_FILE_IMP.substring(TEMP_FILE_IMP.lastIndexOf("/")+1)
-                + "_files");
+        htmlSettings.setImageTargetUri(TEMP_FILE_IMP.substring(TEMP_FILE_IMP.lastIndexOf("/") + 1) + "_files");
         htmlSettings.setWmlPackage(wordMLPackage);
         String tmpHtmlPath = TEMP_FILE_IMP + UUID.randomUUID().toString() + ".html";
         File tmpHtml = new File(tmpHtmlPath);
         OutputStream os = new java.io.FileOutputStream(tmpHtml);
-        Docx4J.toHTML(htmlSettings,os,Docx4J.FLAG_EXPORT_PREFER_XSL);
+        Docx4J.toHTML(htmlSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL);
         os.flush();
 
-        //格式化html代码
+        // 格式化html代码
         String htmlStr = formatHtmlByPath(tmpHtmlPath);
 
-        //删除临时html文件
+        // 删除临时html文件
         FileUtils.deleteQuietly(tmpHtml);
 
         return htmlStr;
@@ -208,30 +244,28 @@ public final class DocxProcessUtil {
 
     /**
      * 替换所有公式为图片
+     * 
      * @param wordMLPackage
      * @throws Exception
      */
-    public static void replaceAllMath2Image(WordprocessingMLPackage wordMLPackage)
-            throws Exception{
+    public static void replaceAllMath2Image(WordprocessingMLPackage wordMLPackage) throws Exception {
         List<Object> pList = getAllElementFromObject(wordMLPackage.getMainDocumentPart(), P.class);
         for (Object pObject : pList) {
-            P p=(P) pObject;
+            P p = (P) pObject;
             List<Object> pContent = p.getContent();
             int index = 0;
-            for(Object child:pContent){
-                if(child instanceof ContentAccessor){
+            for (Object child : pContent) {
+                if (child instanceof ContentAccessor) {
                     index++;
                     continue;
                 }
-                if (child instanceof JAXBElement) child = ((JAXBElement<?>)child).getValue();
+                if (child instanceof JAXBElement)
+                    child = ((JAXBElement<?>) child).getValue();
                 if (child.getClass().equals(CTOMath.class)) {
-                    String omml = XmlUtils.marshaltoString(child, true, true,
-                            Context.jc,
-                            "http://schemas.openxmlformats.org/officeDocument/2006/math",
-                            "oMath", CTOMath.class);
-                    byte [] imgByte = convertMathml2Img(omml2mml(omml));
-                    pContent.set(index,
-                            newImage( wordMLPackage, imgByte, "math"+(index), "math"+(index)));
+                    String omml = XmlUtils.marshaltoString(child, true, true, Context.jc,
+                            "http://schemas.openxmlformats.org/officeDocument/2006/math", "oMath", CTOMath.class);
+                    byte[] imgByte = convertMathml2Img(omml2mml(omml));
+                    pContent.set(index, newImage(wordMLPackage, imgByte, "math" + (index), "math" + (index)));
                 }
                 index++;
             }
@@ -240,27 +274,25 @@ public final class DocxProcessUtil {
 
     /**
      * 替换公式为图片
+     * 
      * @param p
      * @throws Exception
      */
-    public static void replaceMath2Image(WordprocessingMLPackage wordMLPackage,P p)
-            throws Exception{
+    public static void replaceMath2Image(WordprocessingMLPackage wordMLPackage, P p) throws Exception {
         List<Object> pContent = p.getContent();
         int index = 0;
-        for(Object child:pContent){
-            if(child instanceof ContentAccessor){
+        for (Object child : pContent) {
+            if (child instanceof ContentAccessor) {
                 index++;
                 continue;
             }
-            if (child instanceof JAXBElement) child = ((JAXBElement<?>)child).getValue();
+            if (child instanceof JAXBElement)
+                child = ((JAXBElement<?>) child).getValue();
             if (child.getClass().equals(CTOMath.class)) {
-                String omml = XmlUtils.marshaltoString(child, true, true,
-                        Context.jc,
-                        "http://schemas.openxmlformats.org/officeDocument/2006/math",
-                        "oMath", CTOMath.class);
-                byte [] imgByte = convertMathml2Img(omml2mml(omml));
-                pContent.set(index,
-                        newImage( wordMLPackage, imgByte, "math"+(index), "math"+(index)));
+                String omml = XmlUtils.marshaltoString(child, true, true, Context.jc,
+                        "http://schemas.openxmlformats.org/officeDocument/2006/math", "oMath", CTOMath.class);
+                byte[] imgByte = convertMathml2Img(omml2mml(omml));
+                pContent.set(index, newImage(wordMLPackage, imgByte, "math" + (index), "math" + (index)));
             }
             index++;
         }
@@ -268,6 +300,7 @@ public final class DocxProcessUtil {
 
     /**
      * 创建新图片
+     * 
      * @param wordMLPackage
      * @param bytes
      * @param filenameHint
@@ -275,14 +308,12 @@ public final class DocxProcessUtil {
      * @return
      * @throws Exception
      */
-    public static R newImage(WordprocessingMLPackage wordMLPackage,
-                             byte[] bytes,
-                             String filenameHint, String altText) throws Exception {
-        int id1=(int) ((Math.random()*1000)*(Math.random()*1000));
-        int id2=(int) ((Math.random()*1000)*(Math.random()*1000));
+    public static R newImage(WordprocessingMLPackage wordMLPackage, byte[] bytes, String filenameHint, String altText)
+            throws Exception {
+        int id1 = (int) ((Math.random() * 1000) * (Math.random() * 1000));
+        int id2 = (int) ((Math.random() * 1000) * (Math.random() * 1000));
 
-        BinaryPartAbstractImage imagePart = BinaryPartAbstractImage.
-                createImagePart(wordMLPackage,bytes);
+        BinaryPartAbstractImage imagePart = BinaryPartAbstractImage.createImagePart(wordMLPackage, bytes);
 
         Inline inline = imagePart.createImageInline(filenameHint, altText, id1, id2, false);
 
@@ -299,6 +330,7 @@ public final class DocxProcessUtil {
 
     /**
      * 获取wordMl固定节点下所有子节点
+     * 
      * @param obj
      * @param toSearch
      * @return
@@ -306,7 +338,8 @@ public final class DocxProcessUtil {
     public static List<Object> getAllElementFromObject(Object obj, Class<?> toSearch) {
 
         List<Object> result = new ArrayList<Object>();
-        if (obj instanceof JAXBElement) obj = ((JAXBElement<?>) obj).getValue();
+        if (obj instanceof JAXBElement)
+            obj = ((JAXBElement<?>) obj).getValue();
         if (obj.getClass().equals(toSearch))
             result.add(obj);
         else if (obj instanceof ContentAccessor) {
@@ -320,10 +353,11 @@ public final class DocxProcessUtil {
 
     /**
      * omml转换成mml
+     * 
      * @param omml
      * @return
      */
-    public static String omml2mml(String omml){
+    public static String omml2mml(String omml) {
         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
         InputStream stylesheet = ClassLoader.getSystemResourceAsStream(OMML2MML_XSL);
         StringReader sr = new StringReader(omml);
@@ -343,7 +377,7 @@ public final class DocxProcessUtil {
             transformer.transform(source, result);
         } catch (Exception e) {
             e.printStackTrace();
-        } finally{
+        } finally {
             IOUtils.closeQuietly(sr);
             IOUtils.closeQuietly(writer);
         }
@@ -354,25 +388,49 @@ public final class DocxProcessUtil {
 
     /**
      * 格式化转换后的html(html字符串)
+     * 
      * @param htmlStr
      * @return
      */
-    public static String formatHtml(String htmlStr){
-        try{
+    public static String formatHtml(String htmlStr) {
+        try {
             org.jsoup.nodes.Document doc = Jsoup.parse(htmlStr);
             Elements divs = doc.select("div[class='document");
             doc.select("p").removeAttr("class").removeAttr("style");
             doc.select("div").removeAttr("class").removeAttr("style");
             doc.select("span").removeAttr("class").removeAttr("style");
             doc.select("span").stream().forEach(element -> {
-                if(!element.hasText())element.remove();});
-            if(divs.size() > 0){
+                if (!element.hasText())
+                    element.remove();
+            });
+            if (divs.size() > 0) {
                 htmlStr = divs.html();
-            }else{
+            } else {
                 htmlStr = doc.html();
             }
             return htmlStr;
-        }catch(Exception e){
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return htmlStr;
+    }
+
+    /**
+     * 获取html(html字符串)里面文本
+     * 
+     * @param htmlStr
+     * @return
+     */
+    public static String getTextInHtml(String htmlStr) {
+        try {
+            org.jsoup.nodes.Document doc = Jsoup.parse(htmlStr);
+            String textStr = "";
+            Elements links = doc.select("p").removeAttr("img");
+            for (Element link : links) {
+                textStr += link.text();
+            }
+            return textStr;
+        } catch (Exception e) {
             e.printStackTrace();
         }
         return htmlStr;
@@ -380,37 +438,39 @@ public final class DocxProcessUtil {
 
     /**
      * 格式化转换后的html(html临时文件)
+     * 
      * @param htmlPath
      * @return
      */
-    public static String formatHtmlByPath(String htmlPath){
+    public static String formatHtmlByPath(String htmlPath) {
         String htmlStr = "";
         File htmlFile;
-        try{
+        try {
             htmlFile = new File(htmlPath);
-            org.jsoup.nodes.Document doc = Jsoup.parse(htmlFile,ENCODING);
+            org.jsoup.nodes.Document doc = Jsoup.parse(htmlFile, ENCODING);
             Elements divs = doc.select("div[class='document']");
             doc.select("p").removeAttr("class").removeAttr("style");
             doc.select("div").removeAttr("class").removeAttr("style");
             doc.select("span").removeAttr("class").removeAttr("style");
             doc.select("span").stream().forEach(element -> {
-                if(!element.hasText())element.remove();});
+                if (!element.hasText())
+                    element.remove();
+            });
             Elements imgs = doc.select("img");
-            for(org.jsoup.nodes.Element img:imgs){
+            for (org.jsoup.nodes.Element img : imgs) {
                 String imgSrc = img.attr("src");
-                if(!StringUtils.isEmpty(imgSrc)){
-                    String imgBase64 = new String(getBase64ByPath(htmlFile.getParent()
-                            +"/"+imgSrc));
-                    img.attr("src",BASE64_HEADER+imgBase64);
+                if (!StringUtils.isEmpty(imgSrc)) {
+                    String imgBase64 = new String(getBase64ByPath(htmlFile.getParent() + "/" + imgSrc));
+                    img.attr("src", BASE64_HEADER + imgBase64);
                 }
             }
-            if(divs.size() > 0){
+            if (divs.size() > 0) {
                 htmlStr = divs.html();
-            }else{
+            } else {
                 htmlStr = doc.html();
             }
             return htmlStr;
-        }catch(Exception e){
+        } catch (Exception e) {
             e.printStackTrace();
         }
         return htmlStr;
@@ -418,23 +478,24 @@ public final class DocxProcessUtil {
 
     /**
      * 转换mathml为png图片
+     * 
      * @param mathMlStr
      * @return
      */
-    public static byte[] convertMathml2Img(String mathMlStr){
+    public static byte[] convertMathml2Img(String mathMlStr) {
         File xmlFile = null;
         File imgFile = null;
         FileOutputStream xmlFos = null;
         byte[] base64Byte = new byte[0];
         try {
-            xmlFile = new File(TEMP_FILE_IMP,UUID.randomUUID().toString());
-            imgFile = new File(TEMP_FILE_IMP,UUID.randomUUID().toString());
+            xmlFile = new File(TEMP_FILE_IMP, UUID.randomUUID().toString());
+            imgFile = new File(TEMP_FILE_IMP, UUID.randomUUID().toString());
             xmlFos = new FileOutputStream(xmlFile);
             IOUtils.write(mathMlStr, xmlFos, ENCODING);
             xmlFos.flush();
             Converter.getInstance().convert(xmlFile, imgFile, IMG_OUT_TYPE, IMG_LAYOUT);
             base64Byte = IOUtils.toByteArray(new FileInputStream(imgFile));
-        } catch(Exception e) {
+        } catch (Exception e) {
             e.printStackTrace();
         } finally {
             IOUtils.closeQuietly(xmlFos);
@@ -446,10 +507,11 @@ public final class DocxProcessUtil {
 
     /**
      * 通过图片路径获取base64码
+     * 
      * @param imgFilePath
      * @return
      */
-    public static byte[] getBase64ByPath(String imgFilePath){
+    public static byte[] getBase64ByPath(String imgFilePath) {
         InputStream is = null;
         byte[] base64Byte = new byte[0];
         byte[] imgByte;
@@ -458,9 +520,9 @@ public final class DocxProcessUtil {
             is = new FileInputStream(imgFile);
             imgByte = IOUtils.toByteArray(is);
             base64Byte = Base64.encodeBase64(imgByte);
-        }catch(Exception e) {
+        } catch (Exception e) {
             e.printStackTrace();
-        }finally {
+        } finally {
             IOUtils.closeQuietly(is);
             FileUtils.deleteQuietly(imgFile);
         }
@@ -469,10 +531,11 @@ public final class DocxProcessUtil {
 
     /**
      * 通过图片文件获取base64码
+     * 
      * @param imgFile
      * @return
      */
-    public static byte[] getBase64ByFile(File imgFile){
+    public static byte[] getBase64ByFile(File imgFile) {
         InputStream is = null;
         byte[] base64Byte = new byte[0];
         byte[] imgByte;
@@ -480,9 +543,9 @@ public final class DocxProcessUtil {
             is = new FileInputStream(imgFile);
             imgByte = IOUtils.toByteArray(is);
             base64Byte = Base64.encodeBase64(imgByte);
-        }catch(Exception e) {
+        } catch (Exception e) {
             e.printStackTrace();
-        }finally {
+        } finally {
             IOUtils.closeQuietly(is);
         }
         return base64Byte;
@@ -490,76 +553,83 @@ public final class DocxProcessUtil {
 
     /**
      * 格式化段落wordml
+     * 
      * @param pWordMl
      * @return
      * @throws Exception
      */
-    public static String formatPWordMl(String pWordMl) throws Exception{
-        String tmpWordMl = pWordMl.replaceAll("\\\\\"","\"");
+    public static String formatPWordMl(String pWordMl) throws Exception {
+        String tmpWordMl = pWordMl.replaceAll("\\\\\"", "\"");
         SAXReader sax = new SAXReader();
         ByteArrayInputStream is = new ByteArrayInputStream(tmpWordMl.getBytes("UTF-8"));
         org.dom4j.Document document = sax.read(is);
         org.dom4j.Element root = document.getRootElement();
         List<Namespace> namespaces = root.additionalNamespaces();
-        namespaces.stream().forEach(namespace -> {root.remove(namespace);});
+        namespaces.stream().forEach(namespace -> {
+            root.remove(namespace);
+        });
         return root.asXML();
     }
 
     /**
      * 过滤试题单元标题
+     * 
      * @param p
      * @param quesUnit
      * @return
      */
-    public static P formatP(P p, QuesUnit quesUnit){
+    public static P formatP(P p, QuesUnit quesUnit) {
         List<Object> pContent = p.getContent();
         int index = 0;
 
-        for(Object child:pContent) {
-            if(child.getClass().equals(R.class)){
+        for (Object child : pContent) {
+            if (child.getClass().equals(R.class)) {
 
-                R r = (R)child;
+                R r = (R) child;
                 List<Object> rContent = r.getContent();
 
-                for(Object rChild:rContent){
+                for (Object rChild : rContent) {
 
-                    rChild = ((JAXBElement<?>)rChild).getValue();
+                    rChild = ((JAXBElement<?>) rChild).getValue();
 
-                    if(rChild.getClass().equals(Text.class)){
+                    if (rChild.getClass().equals(Text.class)) {
                         ++index;
-                        Text text = (Text)rChild;
+                        Text text = (Text) rChild;
                         String tmpText = text.getValue();
-                        if(quesUnit == QuesUnit.QUES_BODY){
-                            //过滤题干标题
-                            if(tmpText.matches("^\\d{1,}\\.[\\s\\S]*")){
-                                tmpText = tmpText.replaceFirst("\\d{1,}\\.","");
+                        if (quesUnit == QuesUnit.QUES_BODY) {
+                            // 过滤题干标题
+                            if (tmpText.matches("^\\d{1,}\\.[\\s\\S]*")) {
+                                tmpText = tmpText.replaceFirst("\\d{1,}\\.", "");
                                 text.setValue(tmpText);
-                            }else{
-                                tmpText = tmpText.replaceFirst("\\d{1,}","").replaceFirst("\\.","");
+                            } else {
+                                tmpText = tmpText.replaceFirst("\\d{1,}", "").replaceFirst("\\.", "");
                                 text.setValue(tmpText);
-                                if(index == 2)break;
+                                if (index == 2)
+                                    break;
                             }
 
-                        }else if(quesUnit == QuesUnit.QUES_OPTION){
-                            //过滤选项标题
-                            if(tmpText.matches("^[a-zA-Z]\\.[\\s\\S]*")){
-                                tmpText = tmpText.replaceFirst("[a-zA-Z]\\.","");
+                        } else if (quesUnit == QuesUnit.QUES_OPTION) {
+                            // 过滤选项标题
+                            if (tmpText.matches("^[a-zA-Z]\\.[\\s\\S]*")) {
+                                tmpText = tmpText.replaceFirst("[a-zA-Z]\\.", "");
                                 text.setValue(tmpText);
-                            }else{
-                                tmpText = tmpText.replaceFirst("[a-zA-Z]","").replaceFirst("\\.","");
+                            } else {
+                                tmpText = tmpText.replaceFirst("[a-zA-Z]", "").replaceFirst("\\.", "");
                                 text.setValue(tmpText);
-                                if(index == 2)break;
+                                if (index == 2)
+                                    break;
                             }
 
-                        }else if(quesUnit == QuesUnit.QUES_ANSWER){
-                            //过滤答案标题
-                            if(index < 4){
-                                tmpText = tmpText.replaceFirst("\\[|\\]","").replaceFirst("答案","");
-                            }else{
-                                tmpText = tmpText.replaceFirst("[:|:]","");
+                        } else if (quesUnit == QuesUnit.QUES_ANSWER) {
+                            // 过滤答案标题
+                            if (index < 4) {
+                                tmpText = tmpText.replaceFirst("\\[|\\]", "").replaceFirst("答案", "");
+                            } else {
+                                tmpText = tmpText.replaceFirst("[:|:]", "");
                             }
                             text.setValue(tmpText);
-                            if(index == 4)break;
+                            if (index == 4)
+                                break;
                         }
                     }
                 }
@@ -571,100 +641,101 @@ public final class DocxProcessUtil {
 
     /**
      * 导出word
+     * 
      * @param dataMap
      * @param fileName
      */
-    public static void exportWord(Map dataMap,String fileName,String templatePath){
+    public static void exportWord(Map dataMap, String fileName, String templatePath) {
         Writer out = null;
         try {
-            //创建配置实例
+            // 创建配置实例
             Configuration configuration = new Configuration(Configuration.VERSION_2_3_25);
-            //设置编码
+            // 设置编码
             configuration.setDefaultEncoding("UTF-8");
-            //设置ftl模板路径
-            configuration.setClassForTemplateLoading(DocxProcessUtil.class,"/");
-            //获取模板
-            Template template = configuration.getTemplate(templatePath,ENCODING);
-            //输出文件
-            File outFile = new File(TEMP_FILE_EXP+fileName+DOCX_SUFFIX);
-
-            //将模板和数据模型合并生成文件
-            out = new BufferedWriter(new OutputStreamWriter
-                    (new FileOutputStream(outFile),ENCODING));
-            //生成文件
+            // 设置ftl模板路径
+            configuration.setClassForTemplateLoading(DocxProcessUtil.class, "/");
+            // 获取模板
+            Template template = configuration.getTemplate(templatePath, ENCODING);
+            // 输出文件
+            File outFile = new File(TEMP_FILE_EXP + fileName + DOCX_SUFFIX);
+
+            // 将模板和数据模型合并生成文件
+            out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), ENCODING));
+            // 生成文件
             template.process(dataMap, out);
 
             out.flush();
 
         } catch (Exception e) {
             e.printStackTrace();
-        }finally {
+        } finally {
             IOUtils.closeQuietly(out);
         }
     }
 
     /**
      * 导出试卷
+     * 
      * @param dataMap
      * @param fileName
      */
-    public static void exportPaper(Map dataMap,String fileName){
-        exportWord(dataMap,fileName,PAPER_TEMPLATE);
+    public static void exportPaper(Map dataMap, String fileName) {
+        exportWord(dataMap, fileName, PAPER_TEMPLATE);
     }
 
     /**
      * 导出答案
+     * 
      * @param dataMap
      * @param fileName
      */
-    public static void exportAnswer(Map dataMap,String fileName){
-        exportWord(dataMap,fileName,ANSWER_TEMPLATE);
+    public static void exportAnswer(Map dataMap, String fileName) {
+        exportWord(dataMap, fileName, ANSWER_TEMPLATE);
     }
 
     /**
      * 处理导出word中的图片
+     * 
      * @param fileName
      * @param wordMLPackages
      * @throws Exception
      */
-    public static void processImage(String fileName,
-                                    List<WordprocessingMLPackage> wordMLPackages)
-            throws Exception{
+    public static void processImage(String fileName, List<WordprocessingMLPackage> wordMLPackages) throws Exception {
 
-        String filePath = TEMP_FILE_EXP+fileName+DOCX_SUFFIX;
+        String filePath = TEMP_FILE_EXP + fileName + DOCX_SUFFIX;
         InputStream mainFile = new FileInputStream(filePath);
-        //以单个wordXml方式解析freemarker导出的文件
+        // 以单个wordXml方式解析freemarker导出的文件
         FlatOpcXmlImporter flatOpcXmlImporter = new FlatOpcXmlImporter(mainFile);
         WordprocessingMLPackage wordMLPackage = (WordprocessingMLPackage) flatOpcXmlImporter.get();
 
-        for(WordprocessingMLPackage wp:wordMLPackages){
-            //获取资源文件存储
+        for (WordprocessingMLPackage wp : wordMLPackages) {
+            // 获取资源文件存储
             PartStore partStore = wp.getSourcePartStore();
-            //获取图片资源定义
+            // 获取图片资源定义
             RelationshipsPart rp = wp.getMainDocumentPart().getRelationshipsPart();
             List<Relationship> rels = rp.getRelationshipsByType(Namespaces.IMAGE);
 
             List<Part> parts = new ArrayList<Part>();
-            for(Relationship relationship:rels){
+            for (Relationship relationship : rels) {
                 parts.add(rp.getPart(relationship));
             }
-            //添加资源文件存储
+            // 添加资源文件存储
             wordMLPackage.setSourcePartStore(partStore);
-            //添加资源文件定义
-            for(Part p:parts){
-                wordMLPackage.getMainDocumentPart().addTargetPart(p,
-                                      RelationshipsPart.AddPartBehaviour.REUSE_EXISTING,
-                                      p.getSourceRelationship().getId());
+            // 添加资源文件定义
+            for (Part p : parts) {
+                wordMLPackage.getMainDocumentPart().addTargetPart(p, RelationshipsPart.AddPartBehaviour.REUSE_EXISTING,
+                        p.getSourceRelationship().getId());
             }
         }
-        //以word2007标准模式重新保存(zip包)
+        // 以word2007标准模式重新保存(zip包)
         OutputStream os = new java.io.FileOutputStream(filePath);
-        Docx4J.save(wordMLPackage,os,Docx4J.FLAG_SAVE_ZIP_FILE);
+        Docx4J.save(wordMLPackage, os, Docx4J.FLAG_SAVE_ZIP_FILE);
         IOUtils.closeQuietly(os);
     }
 
     /**
      * 获取word二进制数据(空文档,只有样式和资源)
+     * 
      * @param wordMLPackage
      * @return
      * @throws Exception
@@ -674,7 +745,7 @@ public final class DocxProcessUtil {
         DocxProcessUtil.initTmpPackage(wordMLPackage);
 
         ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
-        Docx4J.save(wordMLPackage,outputStream);
+        Docx4J.save(wordMLPackage, outputStream);
         byte[] bytes = outputStream.toByteArray();
 
         outputStream.flush();
@@ -684,11 +755,13 @@ public final class DocxProcessUtil {
 
     /**
      * 通过二进制流获取word文档包
+     * 
      * @param bytes
      * @return
      */
-    public static WordprocessingMLPackage getPkg(byte [] bytes){
-        if(bytes.length == 0)return null;
+    public static WordprocessingMLPackage getPkg(byte[] bytes) {
+        if (bytes.length == 0)
+            return null;
         InputStream inputStream = new ByteArrayInputStream(bytes);
         WordprocessingMLPackage wordMLPackage = null;
         try {
@@ -701,28 +774,28 @@ public final class DocxProcessUtil {
 
     /**
      * 初始化word文档图片资源路径,防止导出试卷时资源ID冲突
+     * 
      * @param wordMLPackage
      */
-    public static void initPkgImage(WordprocessingMLPackage wordMLPackage){
-        //获取文档中所有图片引用位置
+    public static void initPkgImage(WordprocessingMLPackage wordMLPackage) {
+        // 获取文档中所有图片引用位置
         ClassFinder finder = new ClassFinder(CTBlip.class);
         new TraversalUtil(wordMLPackage.getMainDocumentPart().getContent(), finder);
         List<Object> blips = finder.results;
-        //获取文档中所有图片引用定义
-        List<Relationship> relationships =
-                wordMLPackage.getMainDocumentPart()
-                        .getRelationshipsPart().getRelationshipsByType(Namespaces.IMAGE);
-        //同步替换资源ID
+        // 获取文档中所有图片引用定义
+        List<Relationship> relationships = wordMLPackage.getMainDocumentPart().getRelationshipsPart()
+                .getRelationshipsByType(Namespaces.IMAGE);
+        // 同步替换资源ID
         int index = 0;
         String rldHeader = getRldNum();
-        for(Relationship relationship:relationships){
+        for (Relationship relationship : relationships) {
             String tmpId = relationship.getId();
-            for(Object obj:blips){
-                if(obj.getClass().equals(CTBlip.class)){
-                    CTBlip ctBlip = (CTBlip)obj;
+            for (Object obj : blips) {
+                if (obj.getClass().equals(CTBlip.class)) {
+                    CTBlip ctBlip = (CTBlip) obj;
                     String tmpEmbed = ctBlip.getEmbed();
-                    if(tmpId.equals(tmpEmbed)){
-                        String tmp = rldHeader +(++index);
+                    if (tmpId.equals(tmpEmbed)) {
+                        String tmp = rldHeader + (++index);
                         relationship.setId(tmp);
                         ctBlip.setEmbed(tmp);
                     }
@@ -733,9 +806,10 @@ public final class DocxProcessUtil {
 
     /**
      * 获取RldNum
+     * 
      * @return
      */
-    public static String getRldNum(){
+    public static String getRldNum() {
         return REL_ID_HEADER + CommonUtils.getCurNum();
     }
 

+ 2 - 1
cqb-gen-paper/src/main/java/com/qmth/cqb/genpaper/service/GenPaperService.java

@@ -25,7 +25,8 @@ import com.qmth.cqb.paper.model.PaperDetailUnit;
 import com.qmth.cqb.paper.model.PaperStruct;
 import com.qmth.cqb.question.model.Question;
 import com.qmth.cqb.utils.CommonUtils;
-import com.qmth.cqb.utils.enums.QuesStructType;
+
+import cn.com.qmth.examcloud.common.dto.question.enums.QuesStructType;
 
 @Service
 public class GenPaperService {

+ 10 - 10
cqb-paper/src/main/java/com/qmth/cqb/paper/dto/PaperDetailUnitExp.java

@@ -1,29 +1,29 @@
 package com.qmth.cqb.paper.dto;
 
+import java.io.Serializable;
+
 import com.qmth.cqb.question.model.Question;
-import com.qmth.cqb.question.model.QuestionType;
-import com.qmth.cqb.utils.enums.QuesStructType;
 
-import java.io.Serializable;
+import cn.com.qmth.examcloud.common.dto.question.enums.QuesStructType;
 
 /**
- * 试卷小题导出dto
- * Created by songyue on 17/3/15.
+ * 试卷小题导出dto Created by songyue on 17/3/15.
  */
 public class PaperDetailUnitExp implements Serializable {
+
     private static final long serialVersionUID = 6507445685386413261L;
 
     private String id;
 
-    private Integer number;//小题序号
+    private Integer number;// 小题序号
 
-    private Double score;//小题分数
+    private Double score;// 小题分数
 
-    private QuesStructType questionType;//小题类型
+    private QuesStructType questionType;// 小题类型
 
-    private Question question;//关联试题
+    private Question question;// 关联试题
 
-    private String quesId;//关联试题Id
+    private String quesId;// 关联试题Id
 
     public static long getSerialVersionUID() {
         return serialVersionUID;

+ 64 - 53
cqb-paper/src/main/java/com/qmth/cqb/paper/model/ExamPaper.java

@@ -1,76 +1,87 @@
 package com.qmth.cqb.paper.model;
 
-import org.springframework.data.annotation.Id;
-
 import java.io.Serializable;
 
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.index.Indexed;
+
 public class ExamPaper implements Serializable {
 
+    private static final long serialVersionUID = 5708319465238504997L;
+
+    @Id
+    private String id;
+
+    @Indexed(unique = true)
+    private Long examId;
+
+    private String courseCode;
+
+    private String groupCode;
+
+    private String paperId;
+
+    private Integer extractCount;// 抽取试卷次数
 
-	private static final long serialVersionUID = 5708319465238504997L;
+    private Double weight;// 抽取权重比例
 
-	@Id
-	private Long examId;
+    public static long getSerialVersionUID() {
+        return serialVersionUID;
+    }
 
-	private String courseCode;
-	
-	private String groupCode;
-	
-	private String paperId;
-	
-	private Integer extractCount;//抽取试卷次数
-	
-	private Double weight;//抽取权重比例
+    public String getId() {
+        return id;
+    }
 
-	public static long getSerialVersionUID() {
-		return serialVersionUID;
-	}
+    public void setId(String id) {
+        this.id = id;
+    }
 
-	public Long getExamId() {
-		return examId;
-	}
+    public Long getExamId() {
+        return examId;
+    }
 
-	public void setExamId(Long examId) {
-		this.examId = examId;
-	}
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
 
-	public String getCourseCode() {
-		return courseCode;
-	}
+    public String getCourseCode() {
+        return courseCode;
+    }
 
-	public void setCourseCode(String courseCode) {
-		this.courseCode = courseCode;
-	}
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
 
-	public String getGroupCode() {
-		return groupCode;
-	}
+    public String getGroupCode() {
+        return groupCode;
+    }
 
-	public void setGroupCode(String groupCode) {
-		this.groupCode = groupCode;
-	}
+    public void setGroupCode(String groupCode) {
+        this.groupCode = groupCode;
+    }
 
-	public String getPaperId() {
-		return paperId;
-	}
+    public String getPaperId() {
+        return paperId;
+    }
 
-	public void setPaperId(String paperId) {
-		this.paperId = paperId;
-	}
+    public void setPaperId(String paperId) {
+        this.paperId = paperId;
+    }
 
-	public Integer getExtractCount() {
-		return extractCount;
-	}
+    public Integer getExtractCount() {
+        return extractCount;
+    }
 
-	public void setExtractCount(Integer extractCount) {
-		this.extractCount = extractCount;
-	}
+    public void setExtractCount(Integer extractCount) {
+        this.extractCount = extractCount;
+    }
 
-	public Double getWeight() {
-		return weight;
-	}
+    public Double getWeight() {
+        return weight;
+    }
 
-	public void setWeight(Double weight) {
-		this.weight = weight;
-	}
+    public void setWeight(Double weight) {
+        this.weight = weight;
+    }
 }

+ 49 - 39
cqb-paper/src/main/java/com/qmth/cqb/paper/model/ExtractConfig.java

@@ -3,57 +3,67 @@ package com.qmth.cqb.paper.model;
 import java.io.Serializable;
 import java.util.Map;
 
-import com.qmth.cqb.utils.enums.ExtractPolicy;
 import org.springframework.data.annotation.Id;
 
-public class ExtractConfig implements Serializable{
+import com.qmth.cqb.utils.enums.ExtractPolicy;
+
+public class ExtractConfig implements Serializable {
+
+    private static final long serialVersionUID = -5234564748332601375L;
+
+    @Id
+    private String id;
+
+    private Long examId;
+
+    private String courseCode;
+
+    private ExtractPolicy policy;// 抽卷规则
+
+    private Map params;// 类型参数
 
-	private static final long serialVersionUID = -5234564748332601375L;
+    public Long getExamId() {
+        return examId;
+    }
 
-	@Id
-	private Long examId;
-	
-	private String courseCode;
-	
-	private ExtractPolicy policy;//抽卷规则
-	
-	private Map params;//类型参数
+    public String getId() {
+        return id;
+    }
 
-	public Long getExamId() {
-		return examId;
-	}
+    public void setId(String id) {
+        this.id = id;
+    }
 
-	public void setExamId(Long examId) {
-		this.examId = examId;
-	}
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
 
-	public String getCourseCode() {
-		return courseCode;
-	}
+    public String getCourseCode() {
+        return courseCode;
+    }
 
-	public void setCourseCode(String courseCode) {
-		this.courseCode = courseCode;
-	}
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
 
-	public ExtractPolicy getPolicy() {
-		return policy;
-	}
+    public ExtractPolicy getPolicy() {
+        return policy;
+    }
 
-	public void setPolicy(ExtractPolicy policy) {
-		this.policy = policy;
-	}
+    public void setPolicy(ExtractPolicy policy) {
+        this.policy = policy;
+    }
 
-	public Map getParams() {
-		return params;
-	}
+    public Map getParams() {
+        return params;
+    }
 
-	public void setParams(Map params) {
-		this.params = params;
-	}
+    public void setParams(Map params) {
+        this.params = params;
+    }
 
-	public static long getSerialversionuid() {
-		return serialVersionUID;
-	}
-	
+    public static long getSerialversionuid() {
+        return serialVersionUID;
+    }
 
 }

+ 104 - 103
cqb-paper/src/main/java/com/qmth/cqb/paper/model/PaperDetailUnit.java

@@ -2,110 +2,111 @@ package com.qmth.cqb.paper.model;
 
 import java.io.Serializable;
 
-import com.qmth.cqb.question.model.Question;
-import com.qmth.cqb.question.model.QuestionType;
-import com.qmth.cqb.utils.enums.QuesStructType;
 import org.springframework.data.annotation.Id;
 import org.springframework.data.mongodb.core.mapping.DBRef;
 
-public class PaperDetailUnit implements Serializable{
-
-	private static final long serialVersionUID = -8854150484922002075L;
-	
-	@Id
-	private String id;
-	
-	@DBRef
-	private Paper paper;//关联的试卷
-	
-	private Integer number;//小题序号
-	
-	private Double score;//小题分数
-	
-	@DBRef
-	private PaperDetail paperDetail;//关联的大题
-	
-	private QuesStructType questionType;//小题类型
-	
-	@DBRef
-	private Question question;//关联试题
-
-	private String creator;//创建人id
-
-	private String createTime;//创建时间
-
-	public String getId() {
-		return id;
-	}
-
-	public void setId(String id) {
-		this.id = id;
-	}
-
-	public Paper getPaper() {
-		return paper;
-	}
-
-	public void setPaper(Paper paper) {
-		this.paper = paper;
-	}
-
-	public Integer getNumber() {
-		return number;
-	}
-
-	public void setNumber(Integer number) {
-		this.number = number;
-	}
-
-	public Double getScore() {
-		return score;
-	}
-
-	public void setScore(Double score) {
-		this.score = score;
-	}
-
-	public PaperDetail getPaperDetail() {
-		return paperDetail;
-	}
-
-	public void setPaperDetail(PaperDetail paperDetail) {
-		this.paperDetail = paperDetail;
-	}
-
-	public QuesStructType getQuestionType() {
-		return questionType;
-	}
-
-	public void setQuestionType(QuesStructType questionType) {
-		this.questionType = questionType;
-	}
-
-	public Question getQuestion() {
-		return question;
-	}
-
-	public void setQuestion(Question question) {
-		this.question = question;
-	}
-
-	public String getCreator() {
-		return creator;
-	}
-
-	public void setCreator(String creator) {
-		this.creator = creator;
-	}
-
-	public String getCreateTime() {
-		return createTime;
-	}
-
-	public void setCreateTime(String createTime) {
-		this.createTime = createTime;
-	}
-
-	public PaperDetailUnit() {
-	}
+import com.qmth.cqb.question.model.Question;
+
+import cn.com.qmth.examcloud.common.dto.question.enums.QuesStructType;
+
+public class PaperDetailUnit implements Serializable {
+
+    private static final long serialVersionUID = -8854150484922002075L;
+
+    @Id
+    private String id;
+
+    @DBRef
+    private Paper paper;// 关联的试卷
+
+    private Integer number;// 小题序号
+
+    private Double score;// 小题分数
+
+    @DBRef
+    private PaperDetail paperDetail;// 关联的大题
+
+    private QuesStructType questionType;// 小题类型
+
+    @DBRef
+    private Question question;// 关联试题
+
+    private String creator;// 创建人id
+
+    private String createTime;// 创建时间
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public Paper getPaper() {
+        return paper;
+    }
+
+    public void setPaper(Paper paper) {
+        this.paper = paper;
+    }
+
+    public Integer getNumber() {
+        return number;
+    }
+
+    public void setNumber(Integer number) {
+        this.number = number;
+    }
+
+    public Double getScore() {
+        return score;
+    }
+
+    public void setScore(Double score) {
+        this.score = score;
+    }
+
+    public PaperDetail getPaperDetail() {
+        return paperDetail;
+    }
+
+    public void setPaperDetail(PaperDetail paperDetail) {
+        this.paperDetail = paperDetail;
+    }
+
+    public QuesStructType getQuestionType() {
+        return questionType;
+    }
+
+    public void setQuestionType(QuesStructType questionType) {
+        this.questionType = questionType;
+    }
+
+    public Question getQuestion() {
+        return question;
+    }
+
+    public void setQuestion(Question question) {
+        this.question = question;
+    }
+
+    public String getCreator() {
+        return creator;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+
+    public String getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(String createTime) {
+        this.createTime = createTime;
+    }
+
+    public PaperDetailUnit() {
+    }
 }

+ 5 - 4
cqb-paper/src/main/java/com/qmth/cqb/paper/model/PaperDetailUnitStruct.java

@@ -1,20 +1,21 @@
 package com.qmth.cqb.paper.model;
 
-import com.qmth.cqb.utils.enums.QuesStructType;
 import java.io.Serializable;
 
+import cn.com.qmth.examcloud.common.dto.question.enums.QuesStructType;
+
 /**
  * Created by songyue on 17/3/21.
  */
-public class PaperDetailUnitStruct implements Serializable{
+public class PaperDetailUnitStruct implements Serializable {
 
     private static final long serialVersionUID = -3766822545462183904L;
 
     private String id;
 
-    private Double score;//小题分数
+    private Double score;// 小题分数
 
-    private QuesStructType questionType;//小题类型
+    private QuesStructType questionType;// 小题类型
 
     public static long getSerialVersionUID() {
         return serialVersionUID;

+ 99 - 32
cqb-paper/src/main/java/com/qmth/cqb/paper/service/ExtractService.java

@@ -1,50 +1,117 @@
 package com.qmth.cqb.paper.service;
 
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
+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 com.qmth.cqb.paper.dao.ExamPaperRepo;
 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.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.model.Question;
+import com.qmth.cqb.utils.BeanCopierUtil;
+import com.qmth.cqb.utils.CommonUtils;
+import com.qmth.cqb.utils.word.DocxProcessUtil;
+
+import cn.com.qmth.examcloud.common.dto.question.PaperDetailDto;
+import cn.com.qmth.examcloud.common.dto.question.PaperDetailUnitDto;
+import cn.com.qmth.examcloud.common.dto.question.PaperDto;
+import cn.com.qmth.examcloud.common.dto.question.QuesOptionDto;
+import cn.com.qmth.examcloud.common.dto.question.QuestionDto;
+import cn.com.qmth.examcloud.common.dto.question.enums.QuesStructType;
 
 @Service
 public class ExtractService {
-	
-	@Autowired
-	ExamPaperRepo examPaperRepo;
-	
-	@Autowired
-	PaperRepo paperRepo;
-	
-	@Autowired 
-	ExtractConfigRepo extractConfigRepo;
-	
-	/**
-	 * 随机抽一张试卷
-	 * @param papers
-	 * @return
-	 */
-	public Paper randomPaper(List<Paper> papers){
-		if(papers.size() > 0){
-			Collections.shuffle(papers);
-		}else{
-			return null;
-		}
-		return papers.get(0);
-	}
-	
-	
-	public ExtractConfig findConfig(long examId,String courseCode){
-		ExtractConfig tempConfig = new ExtractConfig();
-		tempConfig.setExamId(examId);
-		tempConfig.setCourseCode(courseCode);
-		return extractConfigRepo.findOne(Example.of(tempConfig));
-	}
-	
+
+    @Autowired
+    ExamPaperRepo examPaperRepo;
+
+    @Autowired
+    PaperRepo paperRepo;
+
+    @Autowired
+    ExtractConfigRepo extractConfigRepo;
+
+    @Autowired
+    PaperDetailRepo paperDetailRepo;
+
+    @Autowired
+    PaperDetailUnitRepo paperDetailUnitRepo;
+
+    /**
+     * 随机抽一张试卷
+     * 
+     * @param papers
+     * @return
+     */
+    public Map<String, Object> randomPaper(List<Paper> papers) {
+        String msg = "";
+        Map<String, Object> paperMap = new HashMap<String, Object>();
+        if (papers.size() > 0) {
+            Collections.shuffle(papers);
+        } else {
+            msg = "没有可用的抽取试卷,请检查";
+            paperMap.put("msg", msg);
+            return paperMap;
+        }
+        Paper paper = papers.get(0);
+        PaperDto paperDto = BeanCopierUtil.copyProperties(paper, PaperDto.class);
+        // 获取大题
+        List<PaperDetail> paperDetails = paperDetailRepo.findByPaper(paper);
+        List<PaperDetailDto> paperDetailDtos = BeanCopierUtil.copyPropertiesOfList(paperDetails, PaperDetailDto.class);
+        paperDto.setPaperDetails(paperDetailDtos);
+        // 封装小题
+        for (int i = 0; i < paperDetailDtos.size(); i++) {
+            List<PaperDetailUnit> paperDetailUnits = paperDetailUnitRepo.findByPaperDetail(paperDetails.get(i));
+            List<PaperDetailUnitDto> paperDetailUnitDtos = BeanCopierUtil.copyPropertiesOfList(paperDetailUnits,
+                    PaperDetailUnitDto.class);
+            for (int j = 0; j < paperDetailUnitDtos.size(); j++) {
+                PaperDetailUnitDto unitDto = paperDetailUnitDtos.get(j);
+                unitDto.setQuesId(paperDetailUnits.get(j).getQuestion().getId());
+                if (StringUtils.isNotEmpty(paperDetailUnits.get(j).getQuestion().getQuesAnswer())) {
+                    String answer = DocxProcessUtil
+                            .getTextInHtml(paperDetailUnits.get(j).getQuestion().getQuesAnswer());
+
+                    unitDto.setAnswer(answer);
+                }
+                if (unitDto.getQuestionType() == QuesStructType.NESTED_ANSWER_QUESTION) {// 假如是套题
+                    List<Question> subQuesList = paperDetailUnits.get(j).getQuestion().getSubQuestions();
+                    List<QuestionDto> quesDtos = BeanCopierUtil.copyPropertiesOfList(subQuesList, QuestionDto.class);
+                    for (int m = 0; m < subQuesList.size(); m++) {
+                        List<QuesOptionDto> quesOptionDtos = BeanCopierUtil
+                                .copyPropertiesOfList(subQuesList.get(m).getQuesOptions(), QuesOptionDto.class);
+                        quesDtos.get(m).setQuesOptions(quesOptionDtos);
+                        quesDtos.get(m)
+                                .setQuesAnswer(DocxProcessUtil.getTextInHtml(subQuesList.get(m).getQuesAnswer()));
+                    }
+                    unitDto.setSubQuestions(quesDtos);
+                }
+            }
+            paperDetailDtos.get(i).setPaperDetailUnits(paperDetailUnitDtos);
+            paperDetailDtos.get(i).setCnNum(CommonUtils.toCHNum(paperDetailDtos.get(i).getNumber()));
+        }
+        msg = "success";
+        paperMap.put("paperDto", paperDto);
+        paperMap.put("msg", msg);
+        return paperMap;
+    }
+
+    public ExtractConfig findConfig(long examId, String courseCode) {
+        ExtractConfig tempConfig = new ExtractConfig();
+        tempConfig.setExamId(examId);
+        tempConfig.setCourseCode(courseCode);
+        return extractConfigRepo.findOne(Example.of(tempConfig));
+    }
+
 }

+ 269 - 351
cqb-paper/src/main/java/com/qmth/cqb/paper/service/ImportPaperService.java

@@ -1,13 +1,30 @@
 package com.qmth.cqb.paper.service;
 
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.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.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.commons.CommonsMultipartFile;
+
 import com.google.gson.Gson;
 import com.qmth.cqb.paper.dao.PaperDetailRepo;
 import com.qmth.cqb.paper.dao.PaperDetailUnitRepo;
-
-import java.util.*;
-
 import com.qmth.cqb.paper.dao.PaperRepo;
-import com.qmth.cqb.paper.model.*;
+import com.qmth.cqb.paper.model.ImportPaperCheck;
+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;
@@ -15,19 +32,10 @@ import com.qmth.cqb.question.model.QuestionType;
 import com.qmth.cqb.utils.CommonUtils;
 import com.qmth.cqb.utils.enums.PaperStatus;
 import com.qmth.cqb.utils.enums.PaperType;
-import com.qmth.cqb.utils.enums.QuesStructType;
 import com.qmth.cqb.utils.enums.QuesUnit;
 import com.qmth.cqb.utils.word.DocxProcessUtil;
-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.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.web.multipart.commons.CommonsMultipartFile;
 
-import java.io.*;
+import cn.com.qmth.examcloud.common.dto.question.enums.QuesStructType;
 
 @Service
 public class ImportPaperService {
@@ -55,19 +63,20 @@ public class ImportPaperService {
 
     /**
      * 获取上传文件
+     * 
      * @param file
      * @return
      */
-    public File getUploadFile(CommonsMultipartFile file){
+    public File getUploadFile(CommonsMultipartFile file) {
         String fileName = file.getOriginalFilename();
-        File tempFile = new File(DocxProcessUtil.TEMP_FILE_IMP+fileName);
+        File tempFile = new File(DocxProcessUtil.TEMP_FILE_IMP + fileName);
         OutputStream os = null;
         try {
             os = new FileOutputStream(tempFile);
-            IOUtils.copyLarge(file.getInputStream(),os);
+            IOUtils.copyLarge(file.getInputStream(), os);
         } catch (Exception e) {
             e.printStackTrace();
-        }finally {
+        } finally {
             IOUtils.closeQuietly(os);
         }
         return tempFile;
@@ -75,46 +84,46 @@ public class ImportPaperService {
 
     /**
      * 导入试卷
+     * 
      * @param file
      * @return
      */
-    public String ImportPaper(String paperName,File file){
-        String errorInfo = processImportPaper(paperName,file);
-        if(StringUtils.isEmpty(errorInfo)){
+    public String ImportPaper(String paperName, File file) {
+        String errorInfo = processImportPaper(paperName, file);
+        if (StringUtils.isEmpty(errorInfo)) {
             return "success";
-        }else{
+        } else {
             return errorInfo;
         }
     }
 
     /**
      * 保存导入试卷信息
+     * 
      * @param paper
      * @param paperDetails
      * @param paperDetailUnits
      * @param importPaperCheck
      */
-    public void savePaper(Paper paper,
-                          List paperDetails,
-                          List paperDetailUnits,
-                          List questions,
-                          ImportPaperCheck importPaperCheck){
+    public void savePaper(Paper paper, List paperDetails, List paperDetailUnits, List questions,
+            ImportPaperCheck importPaperCheck) {
 
-        if(!StringUtils.isEmpty(importPaperCheck.errorInfo)) return;
+        if (!StringUtils.isEmpty(importPaperCheck.errorInfo))
+            return;
 
-        if(paper != null){
+        if (paper != null) {
             paperRepo.save(paper);
         }
 
-        if(paperDetails.size() > 0){
+        if (paperDetails.size() > 0) {
             paperDetailRepo.save(paperDetails);
         }
 
-        if(questions.size() > 0){
+        if (questions.size() > 0) {
             quesRepo.save(questions);
         }
 
-        if(paperDetailUnits.size() > 0){
+        if (paperDetailUnits.size() > 0) {
             paperDetailUnitRepo.save(paperDetailUnits);
         }
 
@@ -122,172 +131,130 @@ public class ImportPaperService {
 
     /**
      * 处理导入试卷
+     * 
      * @param file
      */
-    public String processImportPaper(String paperName,File file){
+    public String processImportPaper(String paperName, File file) {
 
         WordprocessingMLPackage wordMLPackage;
         WordprocessingMLPackage tmpWordMlPackage;
         WordprocessingMLPackage writePkg;
         ImportPaperCheck importPaperCheck = new ImportPaperCheck();
 
-        try{
+        try {
             wordMLPackage = WordprocessingMLPackage.load(file);
-            //初始化图片路径
+            // 初始化图片路径
             DocxProcessUtil.initPkgImage(wordMLPackage);
-            //深拷贝临时pkg与最终写入数据库pkg
+            // 深拷贝临时pkg与最终写入数据库pkg
             tmpWordMlPackage = DocxProcessUtil.getTmpPackage(wordMLPackage);
             writePkg = DocxProcessUtil.getTmpPackage(wordMLPackage);
 
-            //获取word文档中所有段落
-            List<Object> pList = DocxProcessUtil.getAllElementFromObject(
-                    wordMLPackage.getMainDocumentPart(), P.class);
+            // 获取word文档中所有段落
+            List<Object> pList = DocxProcessUtil.getAllElementFromObject(wordMLPackage.getMainDocumentPart(), P.class);
 
-            //创建试卷类
+            // 创建试卷类
             Paper paper = new Paper();
 
-            //设置试卷
-            initPaper(paper,paperName);
+            // 设置试卷
+            initPaper(paper, paperName);
 
-            //创建空大题类
+            // 创建空大题类
             PaperDetail paperDetail = null;
 
-            //创建大题集合
+            // 创建大题集合
             List<PaperDetail> paperDetails = new ArrayList<PaperDetail>();
 
-            //创建小题集合
+            // 创建小题集合
             List<PaperDetailUnit> paperDetailUnits = new ArrayList<PaperDetailUnit>();
 
-            //创建试题集合
+            // 创建试题集合
             List<Question> questions = new ArrayList<Question>();
 
-            //大题号
+            // 大题号
             int mainQuesNum = 0;
 
-            //小题号
+            // 小题号
             int subQuesNum = 0;
 
-            for (int i = 0;i < pList.size();i++) {
-                P p=(P) pList.get(i);
+            for (int i = 0; i < pList.size(); i++) {
+                P p = (P) pList.get(i);
                 String pText = DocxProcessUtil.getPText(p);
 
-                //获取大题头信息
-                if(pText.startsWith("[试题分类]")){
+                // 获取大题头信息
+                if (pText.startsWith("[试题分类]")) {
 
-                    //处理大题头信息
-                    processMainQuesHeader(pList,importPaperCheck.index,importPaperCheck);
+                    // 处理大题头信息
+                    processMainQuesHeader(pList, importPaperCheck.index, importPaperCheck);
 
-                    //校验大题头信息
-                    if(!checkQuesHeader(importPaperCheck)){
+                    // 校验大题头信息
+                    if (!checkQuesHeader(importPaperCheck)) {
                         return importPaperCheck.errorInfo;
                     }
 
-                    //创建大题类
+                    // 创建大题类
                     paperDetail = new PaperDetail();
 
-                    //设置大题类
-                    initQuesHeader(paper,
-                                   paperDetail,
-                                   paperDetails,
-                                   ++mainQuesNum,
-                                   importPaperCheck);
+                    // 设置大题类
+                    initQuesHeader(paper, paperDetail, paperDetails, ++mainQuesNum, importPaperCheck);
 
-                }else if(pText.matches("^\\d{1,}\\.[\\s\\S]*")
-                        || (isNested(importPaperCheck) && !pText.startsWith("["))){
-                    //处理试题
+                } else if (pText.matches("^\\d{1,}\\.[\\s\\S]*")
+                        || (isNested(importPaperCheck) && !pText.startsWith("["))) {
+                    // 处理试题
 
-                    //创建小题类和试题类
+                    // 创建小题类和试题类
                     PaperDetailUnit paperDetailUnit = new PaperDetailUnit();
                     Question question = new Question();
 
-                    //初始化小题类和试题类
-                    initPaperDetail(paper,
-                                    paperDetail,
-                                    paperDetailUnit,
-                                    question,
-                                    ++subQuesNum,
-                                    importPaperCheck);
-
-                    //处理客观题
-                    if(importPaperCheck.quesType.equals("单选")
-                            || importPaperCheck.quesType.equals("多选")){
-
-                        //处理题干
-                        processQuesBody(pList,
-                                        importPaperCheck.index,
-                                        question,
-                                        importPaperCheck,
-                                        tmpWordMlPackage);
-
-                        //处理选项
-                        processQuesOption(pList,
-                                          importPaperCheck.index,
-                                          subQuesNum,
-                                          question,
-                                          importPaperCheck,
-                                          tmpWordMlPackage);
-                        //处理尾信息
-                        processQuesTail(pList,
-                                        importPaperCheck.index,
-                                        subQuesNum,
-                                        question,
-                                        paperDetailUnit,
-                                        importPaperCheck,
-                                        tmpWordMlPackage,
-                                        false);
-
-                    }else if(importPaperCheck.quesType.equals("套题")){
-                        //处理套题
-                        processNestedQues(pList,
-                                          importPaperCheck.index,
-                                          question,
-                                          paperDetailUnit,
-                                          importPaperCheck,
-                                          tmpWordMlPackage);
-                    }else{
-                        //处理其他题型
-                        processQuesBody(pList,
-                                        importPaperCheck.index,
-                                        question,
-                                        importPaperCheck,
-                                        tmpWordMlPackage);
-
-                        processQuesTail(pList,
-                                        importPaperCheck.index,
-                                        subQuesNum,
-                                        question,
-                                        paperDetailUnit,
-                                        importPaperCheck,
-                                        tmpWordMlPackage,
-                                        false);
+                    // 初始化小题类和试题类
+                    initPaperDetail(paper, paperDetail, paperDetailUnit, question, ++subQuesNum, importPaperCheck);
+
+                    // 处理客观题
+                    if (importPaperCheck.quesType.equals("单选") || importPaperCheck.quesType.equals("多选")) {
+
+                        // 处理题干
+                        processQuesBody(pList, importPaperCheck.index, question, importPaperCheck, tmpWordMlPackage);
+
+                        // 处理选项
+                        processQuesOption(pList, importPaperCheck.index, subQuesNum, question, importPaperCheck,
+                                tmpWordMlPackage);
+                        // 处理尾信息
+                        processQuesTail(pList, importPaperCheck.index, subQuesNum, question, paperDetailUnit,
+                                importPaperCheck, tmpWordMlPackage, false);
+
+                    } else if (importPaperCheck.quesType.equals("套题")) {
+                        // 处理套题
+                        processNestedQues(pList, importPaperCheck.index, question, paperDetailUnit, importPaperCheck,
+                                tmpWordMlPackage);
+                    } else {
+                        // 处理其他题型
+                        processQuesBody(pList, importPaperCheck.index, question, importPaperCheck, tmpWordMlPackage);
+
+                        processQuesTail(pList, importPaperCheck.index, subQuesNum, question, paperDetailUnit,
+                                importPaperCheck, tmpWordMlPackage, false);
                     }
-                    //设置WordMlPackage二进制数据
-                    setPkgByte(question,writePkg);
+                    // 设置WordMlPackage二进制数据
+                    setPkgByte(question, writePkg);
 
-                    //设置question与Unit集合数据
+                    // 设置question与Unit集合数据
                     questions.add(question);
                     paperDetailUnits.add(paperDetailUnit);
 
-                    //设置当前索引,防止多余循环
+                    // 设置当前索引,防止多余循环
                     i = importPaperCheck.index - 1;
                 }
-                if(!StringUtils.isEmpty(importPaperCheck.errorInfo)){
+                if (!StringUtils.isEmpty(importPaperCheck.errorInfo)) {
                     return importPaperCheck.errorInfo;
                 }
             }
             paper.setPaperDetailCount(mainQuesNum);
-            paper.setTotalScore((double)100);
-            //保存导入试卷信息
-            savePaper(paper,
-                      paperDetails,
-                      paperDetailUnits,
-                      questions,
-                      importPaperCheck);
-
-        }catch (Exception e){
+            paper.setTotalScore((double) 100);
+            // 保存导入试卷信息
+            savePaper(paper, paperDetails, paperDetailUnits, questions, importPaperCheck);
+
+        } catch (Exception e) {
             e.printStackTrace();
             importPaperCheck.setErrorInfo(e.getMessage());
-        }finally {
+        } finally {
             wordMLPackage = null;
             tmpWordMlPackage = null;
             writePkg = null;
@@ -298,10 +265,11 @@ public class ImportPaperService {
 
     /**
      * 初始化试卷信息
+     * 
      * @param paper
      * @param paperName
      */
-    public void initPaper(Paper paper,String paperName){
+    public void initPaper(Paper paper, String paperName) {
         paper.setName(paperName);
         paper.setTitle(paperName);
         paper.setPaperType(PaperType.IMPORT);
@@ -310,27 +278,24 @@ public class ImportPaperService {
 
     /**
      * 初始化大题头信息
+     * 
      * @param paper
      * @param paperDetail
      * @param paperDetails
      * @param mainQuesNum
      * @param importPaperCheck
      */
-    public void initQuesHeader(Paper paper,
-                               PaperDetail paperDetail,
-                               List<PaperDetail> paperDetails,
-                               int mainQuesNum,
-                               ImportPaperCheck importPaperCheck){
+    public void initQuesHeader(Paper paper, PaperDetail paperDetail, List<PaperDetail> paperDetails, int mainQuesNum,
+            ImportPaperCheck importPaperCheck) {
 
         paperDetail.setPaper(paper);
 
-        //设置课程
-        if(StringUtils.isEmpty(paper.getCourseNo())
-                || StringUtils.isEmpty(paper.getCourseName())){
+        // 设置课程
+        if (StringUtils.isEmpty(paper.getCourseNo()) || StringUtils.isEmpty(paper.getCourseName())) {
             paper.setCourseNo(getCourseNo(importPaperCheck));
             paper.setCourseName(getCourseName(importPaperCheck));
         }
-        //设置大题信息
+        // 设置大题信息
         paperDetail.setName(importPaperCheck.quesName);
         paperDetail.setUnitCount(Integer.parseInt(importPaperCheck.quesCount));
         paperDetail.setNumber(mainQuesNum);
@@ -341,18 +306,15 @@ public class ImportPaperService {
 
     /**
      * 初始化试卷明细和试题
+     * 
      * @param paperDetail
      * @param paperDetailUnit
      * @param question
      * @param subQuesNum
      * @param importPaperCheck
      */
-    public void initPaperDetail(Paper paper,
-                                PaperDetail paperDetail,
-                                PaperDetailUnit paperDetailUnit,
-                                Question question,
-                                int subQuesNum,
-                                ImportPaperCheck importPaperCheck){
+    public void initPaperDetail(Paper paper, PaperDetail paperDetail, PaperDetailUnit paperDetailUnit,
+            Question question, int subQuesNum, ImportPaperCheck importPaperCheck) {
 
         question.setQuestionType(getQuesStructType(importPaperCheck.quesType));
         paperDetailUnit.setNumber(++subQuesNum);
@@ -365,35 +327,35 @@ public class ImportPaperService {
 
     /**
      * 校验试题头标识
+     * 
      * @param importPaperCheck
      * @return
      */
-    public boolean checkQuesHeader(ImportPaperCheck importPaperCheck){
+    public boolean checkQuesHeader(ImportPaperCheck importPaperCheck) {
 
         String tmpErrorInfo = "";
-        if(StringUtils.isEmpty(importPaperCheck.quesGroup)){
+        if (StringUtils.isEmpty(importPaperCheck.quesGroup)) {
             tmpErrorInfo += "试题分类为空或格式不正确\n";
 
-        }else if(StringUtils.isEmpty(importPaperCheck.quesType)){
+        } else if (StringUtils.isEmpty(importPaperCheck.quesType)) {
             tmpErrorInfo += "题型为空或格式不正确\n";
 
-        }else if(StringUtils.isEmpty(importPaperCheck.quesName)){
+        } else if (StringUtils.isEmpty(importPaperCheck.quesName)) {
             tmpErrorInfo += "大题名称为空或格式不正确\n";
 
-        }else if(StringUtils.isEmpty(importPaperCheck.quesCount)){
+        } else if (StringUtils.isEmpty(importPaperCheck.quesCount)) {
             tmpErrorInfo += "题目数量为空或格式不正确\n";
 
-        }else if(StringUtils.isEmpty(importPaperCheck.quesScore)){
+        } else if (StringUtils.isEmpty(importPaperCheck.quesScore)) {
             tmpErrorInfo += "分数为空或格式不正确\n";
 
         }
-        if(!StringUtils.isEmpty(importPaperCheck.quesType)
-                && !CommonUtils.checkQuesType(importPaperCheck.quesType)){
+        if (!StringUtils.isEmpty(importPaperCheck.quesType) && !CommonUtils.checkQuesType(importPaperCheck.quesType)) {
             tmpErrorInfo += "题型必须是单选、多选、判断、填空、问答、套题中的一种\n";
         }
-        if(StringUtils.isEmpty(tmpErrorInfo)){
+        if (StringUtils.isEmpty(tmpErrorInfo)) {
             return true;
-        }else{
+        } else {
             importPaperCheck.setErrorInfo(tmpErrorInfo);
             return false;
         }
@@ -401,47 +363,41 @@ public class ImportPaperService {
 
     /**
      * 处理大题头信息
+     * 
      * @param pList
      * @param index
      * @param importPaperCheck
      */
-    public void processMainQuesHeader(List pList,
-                                      int index,
-                                      ImportPaperCheck importPaperCheck){
+    public void processMainQuesHeader(List pList, int index, ImportPaperCheck importPaperCheck) {
 
         int i = 0;
 
-        for(i = index;i < pList.size();i++){
-            P pHeader = (P)pList.get(i);
+        for (i = index; i < pList.size(); i++) {
+            P pHeader = (P) pList.get(i);
             String tmpText = DocxProcessUtil.getPText(pHeader);
-            if(tmpText.startsWith("[试题分类]")){
+            if (tmpText.startsWith("[试题分类]")) {
 
-                importPaperCheck.setQuesGroup(tmpText.replaceAll("\\[试题分类\\]","")
-                        .replaceAll("[:|:]","").trim());
+                importPaperCheck.setQuesGroup(tmpText.replaceAll("\\[试题分类\\]", "").replaceAll("[:|:]", "").trim());
 
-            }else if(tmpText.startsWith("[题型]")){
+            } else if (tmpText.startsWith("[题型]")) {
 
-                importPaperCheck.setQuesType(tmpText.replaceAll("\\[题型\\]","")
-                        .replaceAll("[:|:]","").trim());
+                importPaperCheck.setQuesType(tmpText.replaceAll("\\[题型\\]", "").replaceAll("[:|:]", "").trim());
 
-            }else if(tmpText.startsWith("[大题名称]")){
+            } else if (tmpText.startsWith("[大题名称]")) {
 
-                importPaperCheck.setQuesName(tmpText.replaceAll("\\[大题名称\\]","")
-                        .replaceAll("[:|:]","").trim());
+                importPaperCheck.setQuesName(tmpText.replaceAll("\\[大题名称\\]", "").replaceAll("[:|:]", "").trim());
 
-            }else if(tmpText.startsWith("[题目数量]")){
+            } else if (tmpText.startsWith("[题目数量]")) {
 
-                importPaperCheck.setQuesCount(tmpText.replaceAll("\\[题目数量\\]","")
-                        .replaceAll("[:|:]","").trim());
+                importPaperCheck.setQuesCount(tmpText.replaceAll("\\[题目数量\\]", "").replaceAll("[:|:]", "").trim());
 
-            }else if(tmpText.startsWith("[分数]")){
+            } else if (tmpText.startsWith("[分数]")) {
 
-                importPaperCheck.setQuesScore(tmpText.replaceAll("\\[分数\\]","")
-                        .replaceAll("[:|:]","").trim());
+                importPaperCheck.setQuesScore(tmpText.replaceAll("\\[分数\\]", "").replaceAll("[:|:]", "").trim());
 
-            }else if(StringUtils.isEmpty(tmpText)){
+            } else if (StringUtils.isEmpty(tmpText)) {
                 continue;
-            }else{
+            } else {
                 break;
             }
         }
@@ -450,6 +406,7 @@ public class ImportPaperService {
 
     /**
      * 处理题干信息
+     * 
      * @param pList
      * @param index
      * @param question
@@ -457,34 +414,30 @@ public class ImportPaperService {
      * @param wordMLPackage
      * @throws Exception
      */
-    public void processQuesBody(List pList,
-                                int index,
-                                Question question,
-                                ImportPaperCheck importPaperCheck,
-                                WordprocessingMLPackage wordMLPackage)throws Exception{
-        //定义题干wordml和html
+    public void processQuesBody(List pList, int index, Question question, ImportPaperCheck importPaperCheck,
+            WordprocessingMLPackage wordMLPackage) throws Exception {
+        // 定义题干wordml和html
         String quesBodyWordMl = "";
         String quesBodyHtml = "";
         int i = 0;
 
-        for(i = index;i < pList.size();i++){
-            P pBody = (P)pList.get(i);
+        for (i = index; i < pList.size(); i++) {
+            P pBody = (P) pList.get(i);
             String tmpText = DocxProcessUtil.getPText(pBody);
 
-            //判断是否为题干
-            if(StringUtils.isEmpty(tmpText)){
+            // 判断是否为题干
+            if (StringUtils.isEmpty(tmpText)) {
                 continue;
-            }else if(tmpText.matches("^\\d{1,}\\.[\\s\\S]*")
-                    || (!tmpText.matches("^[a-zA-Z]\\.[\\s\\S]*")
-                    && !tmpText.startsWith("["))){
-                //过滤题干标题
+            } else if (tmpText.matches("^\\d{1,}\\.[\\s\\S]*")
+                    || (!tmpText.matches("^[a-zA-Z]\\.[\\s\\S]*") && !tmpText.startsWith("["))) {
+                // 过滤题干标题
                 pBody = DocxProcessUtil.formatP(pBody, QuesUnit.QUES_BODY);
 
                 String tmpWordMl = DocxProcessUtil.getPWordMl(pBody);
-                String tmpHtml = DocxProcessUtil.docx2Html(tmpWordMl,wordMLPackage);
+                String tmpHtml = DocxProcessUtil.docx2Html(tmpWordMl, wordMLPackage);
                 quesBodyWordMl += DocxProcessUtil.formatPWordMl(tmpWordMl);
                 quesBodyHtml += tmpHtml;
-            }else{
+            } else {
                 break;
             }
         }
@@ -493,10 +446,9 @@ public class ImportPaperService {
         question.setQuesBodyWord(quesBodyWordMl);
     }
 
-
-
     /**
      * 处理题目选项
+     * 
      * @param pList
      * @param index
      * @param subQuesNum
@@ -506,49 +458,45 @@ public class ImportPaperService {
      * @return
      * @throws Exception
      */
-    public String processQuesOption(List pList,
-                                    int index,
-                                    int subQuesNum,
-                                    Question question,
-                                    ImportPaperCheck importPaperCheck,
-                                    WordprocessingMLPackage wordMLPackage)throws Exception{
-
-        //定义试题选项wordml和html
+    public String processQuesOption(List pList, int index, int subQuesNum, Question question,
+            ImportPaperCheck importPaperCheck, WordprocessingMLPackage wordMLPackage) throws Exception {
+
+        // 定义试题选项wordml和html
         String quesOptionWordMl = "";
         String quesOptionHtml = "";
-        //定义选项集合
+        // 定义选项集合
         List<QuesOption> quesOptions = new ArrayList<QuesOption>();
-        //定义选项数量
+        // 定义选项数量
         int optionCount = 0;
 
         int i = 0;
 
-        for(i = index;i < pList.size();i++){
-            P pOption = (P)pList.get(i);
+        for (i = index; i < pList.size(); i++) {
+            P pOption = (P) pList.get(i);
             String tmpText = DocxProcessUtil.getPText(pOption);
 
-            if(StringUtils.isEmpty(tmpText)){
+            if (StringUtils.isEmpty(tmpText)) {
                 continue;
-            }else if(tmpText.matches("^[a-zA-Z]\\.[\\s\\S]*")){//判断是否为选项
+            } else if (tmpText.matches("^[a-zA-Z]\\.[\\s\\S]*")) {// 判断是否为选项
 
                 quesOptionWordMl = DocxProcessUtil.getPWordMl(pOption);
-                quesOptionHtml = DocxProcessUtil.docx2Html(quesOptionWordMl,wordMLPackage);
-                //创建试题选项
+                quesOptionHtml = DocxProcessUtil.docx2Html(quesOptionWordMl, wordMLPackage);
+                // 创建试题选项
                 QuesOption quesOption = new QuesOption();
                 quesOption.setOptionBody(quesOptionHtml);
                 quesOption.setOptionBodyWord(DocxProcessUtil.formatPWordMl(quesOptionWordMl));
-                quesOption.setNumber(tmpText.substring(0,1));
+                quesOption.setNumber(tmpText.substring(0, 1));
                 quesOptions.add(quesOption);
                 optionCount++;
-            }else{
+            } else {
                 break;
             }
         }
         importPaperCheck.setIndex(i);
-        if(optionCount < 2){
-            importPaperCheck.setErrorInfo(getQuesNumInfo(importPaperCheck.quesName,
-                    subQuesNum) +"中选项格式不正确或有缺失,如没有缺失可尝试换行处理\n");
-        }else{
+        if (optionCount < 2) {
+            importPaperCheck.setErrorInfo(
+                    getQuesNumInfo(importPaperCheck.quesName, subQuesNum) + "中选项格式不正确或有缺失,如没有缺失可尝试换行处理\n");
+        } else {
             question.setQuesOptions(quesOptions);
         }
         return importPaperCheck.errorInfo;
@@ -556,6 +504,7 @@ public class ImportPaperService {
 
     /**
      * 处理小题尾信息
+     * 
      * @param pList
      * @param index
      * @param subQuesNum
@@ -563,60 +512,54 @@ public class ImportPaperService {
      * @param paperDetailUnit
      * @param importPaperCheck
      */
-    public void processQuesTail(List pList,
-                                int index,
-                                int subQuesNum,
-                                Question question,
-                                PaperDetailUnit paperDetailUnit,
-                                ImportPaperCheck importPaperCheck,
-                                WordprocessingMLPackage wordMLPackage,
-                                boolean isNested)throws Exception{
+    public void processQuesTail(List pList, int index, int subQuesNum, Question question,
+            PaperDetailUnit paperDetailUnit, ImportPaperCheck importPaperCheck, WordprocessingMLPackage wordMLPackage,
+            boolean isNested) throws Exception {
 
         String quesAnwserWordMl = "";
         String quesAnwserHtml = "";
         String quesScore = "";
-        Map<String,String> quesParams = new HashMap<String,String>();
+        Map<String, String> quesParams = new HashMap<String, String>();
         int i = 0;
 
-        for(i = index;i < pList.size();i++){
-            P pAnswer = (P)pList.get(i);
+        for (i = index; i < pList.size(); i++) {
+            P pAnswer = (P) pList.get(i);
             String tmpText = DocxProcessUtil.getPText(pAnswer);
-            if(StringUtils.isEmpty(tmpText)){
+            if (StringUtils.isEmpty(tmpText)) {
                 continue;
-            }else if(tmpText.startsWith("[答案]")){
-                pAnswer = DocxProcessUtil.formatP(pAnswer,QuesUnit.QUES_ANSWER);
+            } else if (tmpText.startsWith("[答案]")) {
+                pAnswer = DocxProcessUtil.formatP(pAnswer, QuesUnit.QUES_ANSWER);
                 quesAnwserWordMl = DocxProcessUtil.getPWordMl(pAnswer);
-                quesAnwserHtml = DocxProcessUtil.docx2Html(quesAnwserWordMl,wordMLPackage);
+                quesAnwserHtml = DocxProcessUtil.docx2Html(quesAnwserWordMl, wordMLPackage);
 
-            }else if(tmpText.startsWith("[小题分数]")){
-                quesScore = tmpText.replaceAll("\\[小题分数\\]","").replaceAll("[:|:]","").trim();
-            }else{
+            } else if (tmpText.startsWith("[小题分数]")) {
+                quesScore = tmpText.replaceAll("\\[小题分数\\]", "").replaceAll("[:|:]", "").trim();
+            } else {
                 break;
             }
         }
         importPaperCheck.setIndex(i);
-        //校验答案
-        if(!StringUtils.isEmpty(quesAnwserHtml)){
+        // 校验答案
+        if (!StringUtils.isEmpty(quesAnwserHtml)) {
             question.setQuesAnswer(quesAnwserHtml);
-            question.setQuesAnswerWord(
-                    DocxProcessUtil.formatPWordMl(quesAnwserWordMl));
-        }else{
-            importPaperCheck.setErrorInfo(getQuesNumInfo(importPaperCheck.quesName,
-                    subQuesNum) +"答案为空或格式不正确\n");
+            question.setQuesAnswerWord(DocxProcessUtil.formatPWordMl(quesAnwserWordMl));
+        } else {
+            importPaperCheck.setErrorInfo(getQuesNumInfo(importPaperCheck.quesName, subQuesNum) + "答案为空或格式不正确\n");
         }
 
-        //设置小题分数
-        quesParams.put("小题分数",quesScore);
+        // 设置小题分数
+        quesParams.put("小题分数", quesScore);
         question.setQuesParams(quesParams);
 
-        //一般大题明细需要设置分数
-        if(!isNested && !StringUtils.isEmpty(quesScore)){
+        // 一般大题明细需要设置分数
+        if (!isNested && !StringUtils.isEmpty(quesScore)) {
             paperDetailUnit.setScore(Double.parseDouble(quesScore));
         }
     }
 
     /**
      * 处理套题
+     * 
      * @param pList
      * @param index
      * @param question
@@ -624,198 +567,173 @@ public class ImportPaperService {
      * @param importPaperCheck
      * @throws Exception
      */
-    public void processNestedQues(List pList,
-                                  int index,
-                                  Question question,
-                                  PaperDetailUnit paperDetailUnit,
-                                  ImportPaperCheck importPaperCheck,
-                                  WordprocessingMLPackage wordMLPackage)throws Exception{
-        //题型
+    public void processNestedQues(List pList, int index, Question question, PaperDetailUnit paperDetailUnit,
+            ImportPaperCheck importPaperCheck, WordprocessingMLPackage wordMLPackage) throws Exception {
+        // 题型
         String nestedQuesType = "";
 
-        //设置套题题干
-        processQuesBody(pList,index,question,importPaperCheck,wordMLPackage);
+        // 设置套题题干
+        processQuesBody(pList, index, question, importPaperCheck, wordMLPackage);
 
-        //创建小题集合
+        // 创建小题集合
         List<Question> subQuesList = new ArrayList<Question>();
 
         int beginNum = importPaperCheck.index;
 
         int subQuesNum = 0;
-        for(int i = beginNum;i < pList.size();i++){
-            P pSubQues = (P)pList.get(i);
+        for (int i = beginNum; i < pList.size(); i++) {
+            P pSubQues = (P) pList.get(i);
             String tmpText = DocxProcessUtil.getPText(pSubQues);
 
-            if(StringUtils.isEmpty(tmpText)){
+            if (StringUtils.isEmpty(tmpText)) {
                 continue;
-            }if(tmpText.startsWith("[小题型]")){
+            }
+            if (tmpText.startsWith("[小题型]")) {
 
-                nestedQuesType = tmpText.replaceAll("\\[小题型\\]","").replaceAll("[:|:]","").trim();
+                nestedQuesType = tmpText.replaceAll("\\[小题型\\]", "").replaceAll("[:|:]", "").trim();
                 importPaperCheck.index++;
 
-            }else if(tmpText.matches("^\\d\\.[\\s\\S]*")){
+            } else if (tmpText.matches("^\\d\\.[\\s\\S]*")) {
 
                 ++subQuesNum;
 
-                if(StringUtils.isEmpty(nestedQuesType)){
-                    importPaperCheck.setErrorInfo(getQuesNumInfo(importPaperCheck.quesName
-                            ,subQuesNum)+ "小题型为空或格式不正确\n");
+                if (StringUtils.isEmpty(nestedQuesType)) {
+                    importPaperCheck
+                            .setErrorInfo(getQuesNumInfo(importPaperCheck.quesName, subQuesNum) + "小题型为空或格式不正确\n");
                     return;
                 }
 
                 Question subQues = new Question();
 
-                //处理客观题
-                if(nestedQuesType.equals("单选") || nestedQuesType.equals("多选")){
-
-                    //处理题干
-                    processQuesBody(pList,
-                                    importPaperCheck.index,
-                                    subQues,
-                                    importPaperCheck,
-                                    wordMLPackage
-                    );
-
-                    //处理选项
-                    processQuesOption(pList,
-                                      importPaperCheck.index,
-                                      subQuesNum,
-                                      subQues,
-                                      importPaperCheck,
-                                      wordMLPackage);
-
-                    //处理尾信息
-                    processQuesTail(pList,
-                                    importPaperCheck.index,
-                                    subQuesNum,
-                                    subQues,
-                                    paperDetailUnit,
-                                    importPaperCheck,
-                                    wordMLPackage,
-                                    true);
-
-                }else{
-                    //处理其他题型
-                    processQuesBody(pList,
-                                    importPaperCheck.index,
-                                    subQues,
-                                    importPaperCheck,
-                                    wordMLPackage
-                    );
-
-                    processQuesTail(pList,
-                                    importPaperCheck.index,
-                                    subQuesNum,
-                                    subQues,
-                                    paperDetailUnit,
-                                    importPaperCheck,
-                                    wordMLPackage,
-                                    true);
+                // 处理客观题
+                if (nestedQuesType.equals("单选") || nestedQuesType.equals("多选")) {
+
+                    // 处理题干
+                    processQuesBody(pList, importPaperCheck.index, subQues, importPaperCheck, wordMLPackage);
+
+                    // 处理选项
+                    processQuesOption(pList, importPaperCheck.index, subQuesNum, subQues, importPaperCheck,
+                            wordMLPackage);
+
+                    // 处理尾信息
+                    processQuesTail(pList, importPaperCheck.index, subQuesNum, subQues, paperDetailUnit,
+                            importPaperCheck, wordMLPackage, true);
+
+                } else {
+                    // 处理其他题型
+                    processQuesBody(pList, importPaperCheck.index, subQues, importPaperCheck, wordMLPackage);
+
+                    processQuesTail(pList, importPaperCheck.index, subQuesNum, subQues, paperDetailUnit,
+                            importPaperCheck, wordMLPackage, true);
                 }
                 subQuesList.add(subQues);
                 i = importPaperCheck.index - 1;
-            }else{
+            } else {
                 break;
             }
-            if(!StringUtils.isEmpty(importPaperCheck.errorInfo)){
+            if (!StringUtils.isEmpty(importPaperCheck.errorInfo)) {
                 return;
             }
         }
         question.setSubQuestions(subQuesList);
     }
 
-
     /**
      * 获取试题类型
+     * 
      * @param quesType
      * @return
      */
-    public static QuestionType getQuesType(String quesType){
-        return getQuesType(quesType,"");
+    public static QuestionType getQuesType(String quesType) {
+        return getQuesType(quesType, "");
     }
 
     /**
      * 获取试题类型
+     * 
      * @param quesType
      * @param quesName
      * @return
      */
-    public static QuestionType getQuesType(String quesType,String quesName){
-        QuesStructType quesStructType = CommonUtils.getEnum(QuesStructType.class,quesType);
-        return new QuestionType(quesStructType,quesName);
+    public static QuestionType getQuesType(String quesType, String quesName) {
+        QuesStructType quesStructType = CommonUtils.getEnum(QuesStructType.class, quesType);
+        return new QuestionType(quesStructType, quesName);
     }
 
     /**
      * 获取试题结构类型
+     * 
      * @param quesType
      * @return
      */
-    public static QuesStructType getQuesStructType(String quesType){
-        return CommonUtils.getEnum(QuesStructType.class,quesType);
+    public static QuesStructType getQuesStructType(String quesType) {
+        return CommonUtils.getEnum(QuesStructType.class, quesType);
     }
 
-
     /**
      * 获取当前试题大题小题号
+     * 
      * @param quesType
      * @param subQuesNum
      * @return
      */
-    public static String getQuesNumInfo(String quesType,int subQuesNum){
-        return quesType+"第"+subQuesNum+"小题";
+    public static String getQuesNumInfo(String quesType, int subQuesNum) {
+        return quesType + "第" + subQuesNum + "小题";
     }
 
     /**
      * 判断是否为套题
+     * 
      * @param importPaperCheck
      * @return
      */
-    public static boolean isNested(ImportPaperCheck importPaperCheck){
-        if(importPaperCheck.getQuesType().equals("套题")){
+    public static boolean isNested(ImportPaperCheck importPaperCheck) {
+        if (importPaperCheck.getQuesType().equals("套题")) {
             return true;
-        }else{
+        } else {
             return false;
         }
     }
 
     /**
      * 获取课程代码
+     * 
      * @param importPaperCheck
      * @return
      */
-    public static String getCourseNo(ImportPaperCheck importPaperCheck){
-        String [] courseInfo = importPaperCheck.quesGroup.split("_");
-        if(courseInfo.length == 2){
+    public static String getCourseNo(ImportPaperCheck importPaperCheck) {
+        String[] courseInfo = importPaperCheck.quesGroup.split("_");
+        if (courseInfo.length == 2) {
             return courseInfo[1];
-        }else{
+        } else {
             return "";
         }
     }
 
     /**
      * 获取课程名称
+     * 
      * @param importPaperCheck
      * @return
      */
-    public static String getCourseName(ImportPaperCheck importPaperCheck){
-        String [] courseInfo = importPaperCheck.quesGroup.split("_");
-        if(courseInfo.length == 2){
+    public static String getCourseName(ImportPaperCheck importPaperCheck) {
+        String[] courseInfo = importPaperCheck.quesGroup.split("_");
+        if (courseInfo.length == 2) {
             return courseInfo[0];
-        }else{
+        } else {
             return "";
         }
     }
 
     /**
      * 设置wordMLPackage对象二进制数据
+     * 
      * @param question
      * @param wordMLPackage
      * @throws Exception
      */
-    public static void setPkgByte(Question question,
-                                  WordprocessingMLPackage wordMLPackage)throws Exception{
+    public static void setPkgByte(Question question, WordprocessingMLPackage wordMLPackage) throws Exception {
         question.setQuesPkg(DocxProcessUtil.getPkgByte(wordMLPackage));
     }
 
-
 }

+ 28 - 20
cqb-paper/src/main/java/com/qmth/cqb/paper/web/ExtractController.java

@@ -1,44 +1,52 @@
 package com.qmth.cqb.paper.web;
 
-import com.qmth.cqb.paper.model.ExtractConfig;
-import com.qmth.cqb.paper.model.Paper;
-import com.qmth.cqb.paper.service.ExtractService;
-import com.qmth.cqb.paper.service.PaperService;
-
-import java.util.Arrays;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
-import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.ModelAttribute;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import com.qmth.cqb.paper.model.ExtractConfig;
+import com.qmth.cqb.paper.model.Paper;
+import com.qmth.cqb.paper.service.ExtractService;
+import com.qmth.cqb.paper.service.PaperService;
+
+import io.swagger.annotations.ApiOperation;
+
 /**
  * Created by songyue on 16/12/28.
  */
 @RestController
 @RequestMapping("${api_cqb}/")
 public class ExtractController {
+
     @Autowired
     ExtractService extractService;
-    
+
     @Autowired
     PaperService paperService;
 
-	@ApiOperation(value="抽取试卷",notes="抽取试卷")
+    @ApiOperation(value = "抽取试卷", notes = "抽取试卷")
     @GetMapping(value = "/extract/{exam_id}/{course_code}/{group_code}")
-    public Paper extract(@PathVariable String exam_id,@PathVariable String course_code,
-    		@PathVariable String group_code){
-    	Paper paper = null;
-    	ExtractConfig config = extractService.findConfig(Long.parseLong(exam_id), course_code);
-    	if("RANDOM_PAPER".equals(config.getPolicy().getKey())){
-    		List<Paper> papers = paperService.listExamPapers(config.getExamId(), config.getCourseCode(), group_code);
-    	    paper = extractService.randomPaper(papers);
-    	}
-		return paper;
+    public ResponseEntity extract(@PathVariable String exam_id, @PathVariable String course_code,
+            @PathVariable String group_code) {
+        Map<String, Object> paperMap = new HashMap<String, Object>();
+        ExtractConfig config = extractService.findConfig(Long.parseLong(exam_id), course_code);
+        if ("RANDOM_PAPER".equals(config.getPolicy().getKey())) {
+            List<Paper> papers = paperService.listExamPapers(config.getExamId(), config.getCourseCode(), group_code);
+            paperMap = extractService.randomPaper(papers);
+        }
+        if (paperMap.get("msg").equals("success")) {
+            return new ResponseEntity(paperMap.get("paperDto"), HttpStatus.OK);
+        } else {
+            return new ResponseEntity(paperMap.get("msg"), HttpStatus.INTERNAL_SERVER_ERROR);
+        }
     }
-    
+
 }

+ 27 - 23
cqb-question-resource/src/main/java/com/qmth/cqb/question/model/Question.java

@@ -1,50 +1,54 @@
 package com.qmth.cqb.question.model;
 
-import com.qmth.cqb.utils.CommonUtils;
-import com.qmth.cqb.utils.enums.QuesStructType;
-import com.qmth.cqb.utils.word.DocxProcessUtil;
-import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
-import org.springframework.data.annotation.Id;
-
 import java.io.Serializable;
 import java.util.List;
 import java.util.Map;
 
+import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
+import org.springframework.data.annotation.Id;
+
+import com.qmth.cqb.utils.CommonUtils;
+import com.qmth.cqb.utils.word.DocxProcessUtil;
+
+import cn.com.qmth.examcloud.common.dto.question.enums.QuesStructType;
+
 /**
  * Created by songyue on 16/12/27.
  */
-public class Question implements Serializable{
+public class Question implements Serializable {
+
     private static final long serialVersionUID = -493414992043982866L;
+
     @Id
     private String id;
 
-    private String quesBody;//题干,默认为html
+    private String quesBody;// 题干,默认为html
 
-    private String quesBodyWord;//题干word
+    private String quesBodyWord;// 题干word
 
-    private byte[] quesPkg;//试题wordpkg对象序列化数据
+    private byte[] quesPkg;// 试题wordpkg对象序列化数据
 
-    private String quesAnswer;//答案,默认为html
+    private String quesAnswer;// 答案,默认为html
 
-    private String quesAnswerWord;//答案word
+    private String quesAnswerWord;// 答案word
 
-    private String quesAnswerAnalysis;//答案解析,默认为html
+    private String quesAnswerAnalysis;// 答案解析,默认为html
 
-    private String quesAnswerAnalysisWord;//答案word解析
+    private String quesAnswerAnalysisWord;// 答案word解析
 
-    private List<QuesOption> quesOptions;//试题选项
+    private List<QuesOption> quesOptions;// 试题选项
 
-    private List<QuesResource> quesResource;//试题resource(试题资源库集合,适用于多媒体介质试题)
+    private List<QuesResource> quesResource;// 试题resource(试题资源库集合,适用于多媒体介质试题)
 
-    private QuesStructType questionType;//试题结构类型
+    private QuesStructType questionType;// 试题结构类型
 
-    private String createTime;//创建时间
+    private String createTime;// 创建时间
 
-    private String updateTime;//更新时间
+    private String updateTime;// 更新时间
 
-    private List<Question> subQuestions;//子题目,用于套题
+    private List<Question> subQuestions;// 子题目,用于套题
 
-    private Map<String,String> quesParams;//试题属性
+    private Map<String, String> quesParams;// 试题属性
 
     public static long getSerialVersionUID() {
         return serialVersionUID;
@@ -166,7 +170,7 @@ public class Question implements Serializable{
         return quesPkg;
     }
 
-    public WordprocessingMLPackage getPkgObj(){
+    public WordprocessingMLPackage getPkgObj() {
         return DocxProcessUtil.getPkg(this.quesPkg);
     }
 
@@ -174,7 +178,7 @@ public class Question implements Serializable{
         this.quesPkg = quesPkg;
     }
 
-    public Question(){
+    public Question() {
         this.createTime = CommonUtils.getCurDateTime();
     }
 }

+ 37 - 39
cqb-question-resource/src/main/java/com/qmth/cqb/question/model/QuestionType.java

@@ -1,62 +1,60 @@
 package com.qmth.cqb.question.model;
 
-import com.qmth.cqb.utils.enums.QuesStructType;
-
 import java.io.Serializable;
 import java.util.Map;
 
+import cn.com.qmth.examcloud.common.dto.question.enums.QuesStructType;
+
 /**
- * 试题类型(结构类型包装类)
- * Created by songyue on 16/12/28.
+ * 试题类型(结构类型包装类) Created by songyue on 16/12/28.
  */
-public class QuestionType implements Serializable{
-    private static final long serialVersionUID = -4183850561167604080L;
+public class QuestionType implements Serializable {
 
-    private QuesStructType quesType;//结构类型
+    private static final long serialVersionUID = -4183850561167604080L;
 
-    private String name;//类型标题
+    private QuesStructType quesType;// 结构类型
 
-    private Map params;//类型参数
+    private String name;// 类型标题
 
-	public static long getSerialVersionUID() {
-		return serialVersionUID;
-	}
+    private Map params;// 类型参数
 
-	public String getName() {
-		return name;
-	}
+    public static long getSerialVersionUID() {
+        return serialVersionUID;
+    }
 
-	public void setName(String name) {
-		this.name = name;
-	}
-	
+    public String getName() {
+        return name;
+    }
 
+    public void setName(String name) {
+        this.name = name;
+    }
 
-	public QuesStructType getQuesType() {
-		return quesType;
-	}
+    public QuesStructType getQuesType() {
+        return quesType;
+    }
 
-	public void setQuesType(QuesStructType quesType) {
-		this.quesType = quesType;
-	}
+    public void setQuesType(QuesStructType quesType) {
+        this.quesType = quesType;
+    }
 
-	public static long getSerialversionuid() {
-		return serialVersionUID;
-	}
+    public static long getSerialversionuid() {
+        return serialVersionUID;
+    }
 
-	public Map getParams() {
-		return params;
-	}
+    public Map getParams() {
+        return params;
+    }
 
-	public void setParams(Map params) {
-		this.params = params;
-	}
+    public void setParams(Map params) {
+        this.params = params;
+    }
 
-	public QuestionType() {
+    public QuestionType() {
     }
 
-	public QuestionType(QuesStructType quesStructType,String name) {
-		this.quesType = quesStructType;
-		this.name = name;
-	}
+    public QuestionType(QuesStructType quesStructType, String name) {
+        this.quesType = quesStructType;
+        this.name = name;
+    }
 }