Browse Source

新方案导出

xiatian 5 years ago
parent
commit
9279576a52
55 changed files with 3480 additions and 2389 deletions
  1. 2 1
      examcloud-core-questions-api-provider/src/main/java/cn/com/qmth/examcloud/core/questions/api/controller/ExportPaperController.java
  2. 3 2
      examcloud-core-questions-api-provider/src/main/java/cn/com/qmth/examcloud/core/questions/api/controller/PaperController.java
  3. 57 1
      examcloud-core-questions-base/src/main/java/cn/com/qmth/examcloud/core/questions/base/FileDisposeUtil.java
  4. 10 0
      examcloud-core-questions-base/src/main/java/cn/com/qmth/examcloud/core/questions/base/dto/ExportTempDataDto.java
  5. 12 0
      examcloud-core-questions-base/src/main/java/cn/com/qmth/examcloud/core/questions/base/dto/ExportTemplateDto.java
  6. 0 55
      examcloud-core-questions-base/src/main/java/cn/com/qmth/examcloud/core/questions/base/json/DocxImage.java
  7. 27 0
      examcloud-core-questions-base/src/main/java/cn/com/qmth/examcloud/core/questions/base/json/JOption.java
  8. 20 0
      examcloud-core-questions-base/src/main/java/cn/com/qmth/examcloud/core/questions/base/json/JOptionDto.java
  9. 0 214
      examcloud-core-questions-base/src/main/java/cn/com/qmth/examcloud/core/questions/base/json/JsonExportUtil.java
  10. 1 1
      examcloud-core-questions-base/src/main/java/cn/com/qmth/examcloud/core/questions/base/json/SectionElement.java
  11. 10 0
      examcloud-core-questions-base/src/main/java/cn/com/qmth/examcloud/core/questions/base/json/SectionElementParams.java
  12. 66 0
      examcloud-core-questions-base/src/main/resources/export_template/origin_paper/doc_section.ftl
  13. 112 0
      examcloud-core-questions-base/src/main/resources/export_template/origin_paper/exam_reamark_document.ftl
  14. 97 0
      examcloud-core-questions-base/src/main/resources/export_template/origin_paper/question_options.ftl
  15. 12 0
      examcloud-core-questions-dao/src/main/java/cn/com/qmth/examcloud/core/questions/dao/entity/Question.java
  16. 9 9
      examcloud-core-questions-dao/src/main/java/cn/com/qmth/examcloud/core/questions/dao/entity/QuestionBak.java
  17. 1 1
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/ExportPaperService.java
  18. 4 0
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/ExportTemplateService.java
  19. 5 2
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/ImportDdCollegePaperService.java
  20. 8 8
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/QuesService.java
  21. 20 22
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/BjhkExportPaperService.java
  22. 17 18
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/BjjtExportPaperService.java
  23. 21 23
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/BjsfExportPaperService.java
  24. 22 13
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/BuildComputerTestJsonService.java
  25. 21 23
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/CqdxExportPaperService.java
  26. 20 22
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/CugbExportPaperService.java
  27. 21 23
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/DbsfExportPaperService.java
  28. 17 18
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/DzkdExportPaperService.java
  29. 448 466
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/ExportPaperAbstractService.java
  30. 21 23
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/FdsfExportPaperService.java
  31. 21 23
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/FjsfExportPaperService.java
  32. 18 18
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/HnsfExportPaperService.java
  33. 15 16
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/HzkjExportPaperService.java
  34. 146 145
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/InitPaperExpService.java
  35. 22 24
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/NkdxExportPaperService.java
  36. 15 16
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/RjgcExportPaperService.java
  37. 15 16
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/SddxExportPaperService.java
  38. 26 24
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/SxsfExportPaperService.java
  39. 124 127
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/SydxExportPaperService.java
  40. 33 36
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/TjdxExportPaperService.java
  41. 21 23
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/WheqxExportPaperService.java
  42. 30 33
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/XnjdExportPaperService.java
  43. 16 17
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/YkdxExportPaperService.java
  44. 21 23
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/ZgddbExportPaperService.java
  45. 21 23
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/ZgddwExportPaperService.java
  46. 15 16
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/xajdExportPaperService.java
  47. 210 221
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/impl/ExportPaperServiceImpl.java
  48. 70 9
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/impl/ExportTemplateServiceImpl.java
  49. 58 43
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/impl/ExtractConfigFileServiceImpl.java
  50. 168 127
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/impl/PaperServiceImpl.java
  51. 150 145
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/impl/QuesServiceImpl.java
  52. 309 319
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/temp/CqdxService.java
  53. 57 0
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/util/DocxTemplateBean.java
  54. 723 0
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/util/ExportPaperUtil.java
  55. 92 0
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/util/ExportTemplateUtil.java

+ 2 - 1
examcloud-core-questions-api-provider/src/main/java/cn/com/qmth/examcloud/core/questions/api/controller/ExportPaperController.java

@@ -139,7 +139,8 @@ public class ExportPaperController extends ControllerSupport {
     public void downOriginalPaperPlus(HttpServletResponse response, @PathVariable String paperId,
             @PathVariable String loginName) {
         try {
-            exportPaperService.downOriginalPaperPlus(paperId, loginName, response);
+            User user=getAccessUser();
+            exportPaperService.downOriginalPaperPlus(paperId, user.getRootOrgId(), response);
         } catch (Exception e) {
             log.error(e.getMessage(), e);
         }

+ 3 - 2
examcloud-core-questions-api-provider/src/main/java/cn/com/qmth/examcloud/core/questions/api/controller/PaperController.java

@@ -22,6 +22,7 @@ import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperExp;
 import cn.com.qmth.examcloud.core.questions.service.bean.paper.PreviewPaperHandler;
 import cn.com.qmth.examcloud.core.questions.service.config.SysProperty;
 import cn.com.qmth.examcloud.core.questions.service.export.ExportPaperAbstractService;
+import cn.com.qmth.examcloud.core.questions.service.util.ExportTemplateUtil;
 import cn.com.qmth.examcloud.web.support.ControllerSupport;
 import cn.com.qmth.examcloud.web.support.Naked;
 import freemarker.template.TemplateException;
@@ -626,7 +627,7 @@ public class PaperController extends ControllerSupport {
             map.put("courseNo", previewPaper.getCourseNo());
             map.put("courseName", previewPaper.getCourseName());
             map.put("courseLevel", previewPaper.getCourseLevel());
-            exportPaperService.getTemplate(Long.valueOf(paper.getOrgId()), ExportTemplateType.PAPER_VIEW).process(map, result);
+            ExportTemplateUtil.getTemplate(Long.valueOf(paper.getOrgId()), ExportTemplateType.PAPER_VIEW).process(map, result);
             String content=result.toString();
             model.addAttribute("pageContent", content);
             return BASE_PAGE;
@@ -681,7 +682,7 @@ public class PaperController extends ControllerSupport {
             map.put("courseNo", previewPaper.getCourseNo());
             map.put("courseName", previewPaper.getCourseName());
             map.put("courseLevel", previewPaper.getCourseLevel());
-            exportPaperService.getTemplate(Long.valueOf(paper.getOrgId()), ExportTemplateType.ANWSER_VIEW).process(map, result);
+            ExportTemplateUtil.getTemplate(Long.valueOf(paper.getOrgId()), ExportTemplateType.ANWSER_VIEW).process(map, result);
             String content=result.toString();
             model.addAttribute("pageContent", content);
             return BASE_PAGE;

+ 57 - 1
examcloud-core-questions-base/src/main/java/cn/com/qmth/examcloud/core/questions/base/FileDisposeUtil.java

@@ -18,7 +18,9 @@ import java.net.URLEncoder;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.util.Enumeration;
 import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
 import java.util.zip.ZipOutputStream;
 
 import javax.servlet.http.HttpServletResponse;
@@ -300,5 +302,59 @@ public class FileDisposeUtil {
             }
         }
     }
-
+    public static void unZipFiles(String zipFileName, String targetDirName) throws  IOException{
+        if (!targetDirName.endsWith(File.separator)) {
+            targetDirName = targetDirName + File.separator;
+        }
+        ZipFile zipFile = null;
+        try {
+            //Create the ZipFile object from the ZIP file
+            zipFile = new ZipFile(zipFileName);
+            ZipEntry entry = null;
+            String entryName = null;
+            String descFileDir = null;
+            byte[] buf = new byte[4096];
+            int readByte = 0;
+            // Gets all entry in the ZIP file
+            @SuppressWarnings("rawtypes")
+            Enumeration enums = zipFile.entries();
+            // Go through all entry
+            while (enums.hasMoreElements()) {
+                entry = (ZipEntry) enums.nextElement();
+                // Get the name entry
+                entryName = entry.getName();
+                descFileDir = targetDirName + entryName;
+                if (entry.isDirectory()) {
+                    // If entry is a directory, create the directory
+//                    entry.setUnixMode(755);// Solve Linux mess file Settings 644 directory Settings 755
+                    new File(descFileDir).mkdirs();
+                    continue;
+                } else {
+                    // If entry is a file, the parent directory is created
+//                    entry.setUnixMode(644);//Solve Linux mess file Settings 644 directory Settings 755
+                    new File(descFileDir).getParentFile().mkdirs();
+                }
+                File file = new File(descFileDir);
+                // Open the file output stream
+                OutputStream os = null;
+                // Open the entry input stream from the ZipFile object
+                InputStream is = null;
+                try {
+                    os = new FileOutputStream(file);
+                    is = zipFile.getInputStream(entry);
+                    while ((readByte = is.read(buf)) != -1) {
+                        os.write(buf, 0, readByte);
+                    }
+                } finally {
+                    if (os != null)
+                        os.close();
+                    if (is != null)
+                        is.close();
+                }
+            }
+        } finally {
+            if (zipFile != null)
+                zipFile.close();
+        }
+    }
 }

+ 10 - 0
examcloud-core-questions-base/src/main/java/cn/com/qmth/examcloud/core/questions/base/dto/ExportTempDataDto.java

@@ -9,6 +9,8 @@ import cn.com.qmth.examcloud.core.questions.base.json.SectionElement;
 
 public class ExportTempDataDto {
 
+    private int answerNum = 0;
+
     private int mainNum = 0;
 
     private int subNum = 0;
@@ -69,4 +71,12 @@ public class ExportTempDataDto {
         this.grandNum = grandNum;
     }
 
+    public int getAnswerNum() {
+        return answerNum;
+    }
+
+    public void setAnswerNum(int answerNum) {
+        this.answerNum = answerNum;
+    }
+
 }

+ 12 - 0
examcloud-core-questions-base/src/main/java/cn/com/qmth/examcloud/core/questions/base/dto/ExportTemplateDto.java

@@ -13,6 +13,8 @@ public class ExportTemplateDto {
     private String typeName;
 
     private String fileName;
+    
+    private String originalFileName;
 
     private String suffix;
 
@@ -124,4 +126,14 @@ public class ExportTemplateDto {
         this.typeName = typeName;
     }
 
+    
+    public String getOriginalFileName() {
+        return originalFileName;
+    }
+
+    
+    public void setOriginalFileName(String originalFileName) {
+        this.originalFileName = originalFileName;
+    }
+
 }

+ 0 - 55
examcloud-core-questions-base/src/main/java/cn/com/qmth/examcloud/core/questions/base/json/DocxImage.java

@@ -1,55 +0,0 @@
-package cn.com.qmth.examcloud.core.questions.base.json;
-
-public class DocxImage {
-
-    private String type;
-
-    private String data;
-
-    private int index;
-
-    private String name;
-
-    private String rid;
-
-    public String getType() {
-        return type;
-    }
-
-    public void setType(String type) {
-        this.type = type;
-    }
-
-    public String getData() {
-        return data;
-    }
-
-    public void setData(String data) {
-        this.data = data;
-    }
-
-    public int getIndex() {
-        return index;
-    }
-
-    public void setIndex(int index) {
-        this.index = index;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getRid() {
-        return rid;
-    }
-
-    public void setRid(String rid) {
-        this.rid = rid;
-    }
-
-}

+ 27 - 0
examcloud-core-questions-base/src/main/java/cn/com/qmth/examcloud/core/questions/base/json/JOption.java

@@ -0,0 +1,27 @@
+package cn.com.qmth.examcloud.core.questions.base.json;
+
+import java.util.List;
+
+public class JOption {
+
+    private int cols = 1;
+
+    private List<JSection> jsections;
+
+    public List<JSection> getJsections() {
+        return jsections;
+    }
+
+    public void setJsections(List<JSection> jsections) {
+        this.jsections = jsections;
+    }
+
+    public int getCols() {
+        return cols;
+    }
+
+    public void setCols(int cols) {
+        this.cols = cols;
+    }
+
+}

+ 20 - 0
examcloud-core-questions-base/src/main/java/cn/com/qmth/examcloud/core/questions/base/json/JOptionDto.java

@@ -0,0 +1,20 @@
+package cn.com.qmth.examcloud.core.questions.base.json;
+
+import java.util.List;
+
+public class JOptionDto {
+    List<JOption> options;
+
+    
+    public List<JOption> getOptions() {
+        return options;
+    }
+
+    
+    public void setOptions(List<JOption> options) {
+        this.options = options;
+    }
+
+    
+    
+}

+ 0 - 214
examcloud-core-questions-base/src/main/java/cn/com/qmth/examcloud/core/questions/base/json/JsonExportUtil.java

@@ -1,214 +0,0 @@
-package cn.com.qmth.examcloud.core.questions.base.json;
-
-import java.io.IOException;
-import java.io.StringWriter;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.apache.commons.lang3.StringUtils;
-import org.jsoup.Jsoup;
-import org.jsoup.nodes.Document;
-import org.jsoup.nodes.Element;
-import org.jsoup.nodes.Node;
-import org.jsoup.nodes.TextNode;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import cn.com.qmth.examcloud.commons.exception.ExamCloudRuntimeException;
-import freemarker.template.Configuration;
-import freemarker.template.Template;
-
-public class JsonExportUtil {
-
-    private static final Logger log = LoggerFactory.getLogger(JsonExportUtil.class);
-
-    public static final String QUESOPS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
-
-    public static final String ELEMENT_TYPE_RID = "imageId";
-
-    public static final String ELEMENT_TYPE_TEXT = "text";
-
-    public static final String ELEMENT_TYPE_IMG = "image";
-
-    private static final String ENCODING = "UTF-8";
-
-    private static Configuration config;
-
-    private static Template questionSection;
-
-    private static Template contentTypes;
-
-    private static Template document;
-
-    private static Template documentRel;
-
-    private static Pattern heightRex = Pattern.compile("height:([\\s\\S]*?)px");
-
-    private static Pattern widthRex = Pattern.compile("width:([\\s\\S]*?)px");
-    static {
-
-        config = new Configuration(Configuration.VERSION_2_3_25);
-        // 设置编码
-        config.setDefaultEncoding(ENCODING);
-        // 设置ftl模板路径
-        config.setClassForTemplateLoading(JsonExportUtil.class, "/export_template/origin_paper/");
-
-        try {
-            questionSection = config.getTemplate("question_section.ftl", ENCODING);
-            contentTypes = config.getTemplate("content_types.ftl", ENCODING);
-            document = config.getTemplate("document.ftl", ENCODING);
-            documentRel = config.getTemplate("document_rel.ftl", ENCODING);
-        } catch (IOException e) {
-            log.error(e.getMessage(), e);
-        }
-    }
-
-    public static String getDocxBasePath() {
-        return JsonExportUtil.class.getProtectionDomain().getCodeSource().getLocation().getPath()
-                + "export_template/docx";
-    }
-
-    public static List<JSection> getSections(String html) {
-        if (StringUtils.isBlank(html)) {
-            return null;
-        }
-        html=html.trim();
-        if (!html.startsWith("<p>")) {
-            html = "<p>" + html + "</p>";
-        }
-        List<JSection> ss = new ArrayList<JSection>();
-        Document doc = Jsoup.parse(html);
-        Element b = doc.body();
-        for (Node e : b.childNodes()) {
-            if ("p".equals(e.nodeName()) && e.childNodeSize() > 0) {
-                JSection s = new JSection();
-                List<SectionElement> ses = new ArrayList<SectionElement>();
-                s.setElements(ses);
-                for (Node ce : e.childNodes()) {
-                    getSectionElement(ce, ses);
-                }
-                ss.add(s);
-            }
-        }
-        return ss;
-
-    }
-
-    private static void getSectionElement(Node ce, List<SectionElement> ses) {
-        if ("span".equals(ce.nodeName()) && ce.childNodeSize() > 0) {
-            for (Node e : ce.childNodes()) {
-                getSectionElement(e, ses);
-            }
-        } else {
-            SectionElement se = new SectionElement();
-            if (ce instanceof TextNode) {
-                TextNode tn = (TextNode) ce;
-                se.setType(ELEMENT_TYPE_TEXT);
-                se.setValue(tn.text());
-            } else if (ce instanceof Element) {
-                if ("img".equals(ce.nodeName())) {
-                    se.setType(ELEMENT_TYPE_IMG);
-                    se.setValue(ce.attr("src"));
-                    SectionElementParams sep = new SectionElementParams();
-                    sep.setHeight(getHeight(ce));
-                    sep.setWidth(getWidth(ce));
-                    se.setParams(sep);
-                } else {
-                    Element el = (Element) ce;
-                    se.setType(ELEMENT_TYPE_TEXT);
-                    se.setValue(el.text());
-                }
-            }
-            ses.add(se);
-        }
-    }
-
-    private static int getWidth(Node ce) {
-        int n = 50;
-        String str = ce.attr("width");
-        if (StringUtils.isNoneBlank(str)) {
-            return getWordImgSize(str);
-        }
-        String style = ce.attr("style");
-        if (StringUtils.isNoneBlank(style)) {
-            Matcher m = widthRex.matcher(style);
-            if (m.find()) {
-                return Integer.valueOf(m.group(1)) * 9525;
-            }
-        }
-        return n;
-    }
-
-    private static int getHeight(Node ce) {
-        int n = 50;
-        String str = ce.attr("height");
-        if (StringUtils.isNoneBlank(str)) {
-            return getWordImgSize(str);
-        }
-        String style = ce.attr("style");
-        if (StringUtils.isNoneBlank(style)) {
-            Matcher m = heightRex.matcher(style);
-            if (m.find()) {
-                return Integer.valueOf(m.group(1)) * 9525;
-            }
-        }
-        return n;
-    }
-
-    private static Integer getWordImgSize(String px) {
-        if (StringUtils.isBlank(px)) {
-            return null;
-        }
-        String sizeStr = px.replace("px", "");
-        Integer size = Integer.valueOf(sizeStr) * 9525;
-        return size;
-    }
-
-    public static String getDocumentDoc(Object paperExp) {
-        StringWriter result = null;
-        try {
-            result = new StringWriter();
-            document.process(paperExp, result);
-            return result.toString();
-        } catch (Exception e) {
-            throw new ExamCloudRuntimeException(e);
-        }
-    }
-
-    public static String getDocumentRelDoc(Map<String, Object> map) {
-        StringWriter result = null;
-        try {
-            result = new StringWriter();
-            documentRel.process(map, result);
-            return result.toString();
-        } catch (Exception e) {
-            throw new ExamCloudRuntimeException(e);
-        }
-    }
-
-    public static String getQuestionSectionDoc(Map<String, Object> map) {
-        StringWriter result = null;
-        try {
-            result = new StringWriter();
-            questionSection.process(map, result);
-            return result.toString();
-        } catch (Exception e) {
-            throw new ExamCloudRuntimeException(e);
-        }
-    }
-
-    public static String getContentTypesDoc(Map<String, Object> map) {
-        StringWriter result = null;
-        try {
-            result = new StringWriter();
-            contentTypes.process(map, result);
-            return result.toString();
-        } catch (Exception e) {
-            throw new ExamCloudRuntimeException(e);
-        }
-    }
-
-}

+ 1 - 1
examcloud-core-questions-base/src/main/java/cn/com/qmth/examcloud/core/questions/base/json/SectionElement.java

@@ -6,7 +6,7 @@ public class SectionElement {
 
     private String value;
 
-    private SectionElementParams params;
+    private SectionElementParams params=new SectionElementParams();
 
     public String getType() {
         return type;

+ 10 - 0
examcloud-core-questions-base/src/main/java/cn/com/qmth/examcloud/core/questions/base/json/SectionElementParams.java

@@ -12,6 +12,8 @@ public class SectionElementParams {
 
     private String type;
 
+    private boolean tab = false;
+
     public Integer getWidth() {
         return width;
     }
@@ -52,4 +54,12 @@ public class SectionElementParams {
         this.type = type;
     }
 
+    public boolean isTab() {
+        return tab;
+    }
+
+    public void setTab(boolean tab) {
+        this.tab = tab;
+    }
+
 }

+ 66 - 0
examcloud-core-questions-base/src/main/resources/export_template/origin_paper/doc_section.ftl

@@ -0,0 +1,66 @@
+
+<#setting number_format="#">
+<#list sections as section>
+<w:p w:rsidR="00F62967" w:rsidRPr="003A4B1C"
+	w:rsidRDefault="00F62967" w:rsidP="00F62967">
+	<#list section.elements as element>
+	<#if element.type="image">
+	<w:r>
+		<w:rPr>
+			<w:noProof />
+		</w:rPr>
+		<w:drawing>
+			<wp:inline distT="0" distB="0" distL="0" distR="0">
+				<wp:extent cx="${element.params.width}"
+					cy="${element.params.height}" />
+				<wp:effectExtent l="0" t="0" r="0" b="0" />
+				<wp:docPr id="${element.params.index}"
+					name="图片 ${element.params.index}" />
+				<wp:cNvGraphicFramePr>
+					<a:graphicFrameLocks
+						xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"
+						noChangeAspect="1" />
+				</wp:cNvGraphicFramePr>
+				<a:graphic
+					xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">
+					<a:graphicData
+						uri="http://schemas.openxmlformats.org/drawingml/2006/picture">
+						<pic:pic
+							xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture">
+							<pic:nvPicPr>
+								<pic:cNvPr id="1" name="" />
+								<pic:cNvPicPr />
+							</pic:nvPicPr>
+							<pic:blipFill>
+								<a:blip r:embed="${element.params.rid}" />
+								<a:stretch>
+									<a:fillRect />
+								</a:stretch>
+							</pic:blipFill>
+							<pic:spPr>
+								<a:xfrm>
+									<a:off x="0" y="0" />
+									<a:ext cx="${element.params.width}"
+										cy="${element.params.height}" />
+								</a:xfrm>
+								<a:prstGeom prst="rect">
+									<a:avLst />
+								</a:prstGeom>
+							</pic:spPr>
+						</pic:pic>
+					</a:graphicData>
+				</a:graphic>
+			</wp:inline>
+		</w:drawing>
+	</w:r>
+	<#else>
+	<w:r w:rsidRPr="003A4B1C">
+		<w:rPr>
+			<w:rFonts w:hint="eastAsia" />
+		</w:rPr>
+		<w:t>${element.value}</w:t>
+	</w:r>
+	</#if>
+	</#list>
+</w:p>
+</#list>

+ 112 - 0
examcloud-core-questions-base/src/main/resources/export_template/origin_paper/exam_reamark_document.ftl

@@ -0,0 +1,112 @@
+<#setting number_format="#">
+<?xml version="1.0" encoding="UTF-8"?>
+<w:document
+	xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas"
+	xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+	xmlns:o="urn:schemas-microsoft-com:office:office"
+	xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
+	xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"
+	xmlns:v="urn:schemas-microsoft-com:vml"
+	xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing"
+	xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing"
+	xmlns:w10="urn:schemas-microsoft-com:office:word"
+	xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
+	xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml"
+	xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml"
+	xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup"
+	xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk"
+	xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml"
+	xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape"
+	mc:Ignorable="w14 w15 wp14">
+	<w:body>
+	        <w:p>
+            <w:pPr>
+                <w:spacing w:after="269"/>
+                <w:ind w:left="120"/>
+                <w:jc w:val="center"/>
+            </w:pPr>
+            <w:r>
+                <w:rPr>
+                    <w:b w:val="false"/>
+                    <w:i w:val="false"/>
+                    <w:color w:val="000000"/>
+                    <w:sz w:val="39"/>
+                </w:rPr>
+                <w:t>考 试 说 明</w:t>
+            </w:r>
+        </w:p>
+<#if sections?exists>
+<#list sections as section>
+<w:p w:rsidR="00F62967" w:rsidRPr="003A4B1C"
+	w:rsidRDefault="00F62967" w:rsidP="00F62967">
+	<#list section.elements as element>
+	<#if element.type="image">
+	<w:r>
+		<w:rPr>
+			<w:noProof />
+		</w:rPr>
+		<w:drawing>
+			<wp:inline distT="0" distB="0" distL="0" distR="0">
+				<wp:extent cx="${element.params.width}"
+					cy="${element.params.height}" />
+				<wp:effectExtent l="0" t="0" r="0" b="0" />
+				<wp:docPr id="${element.params.index}"
+					name="图片 ${element.params.index}" />
+				<wp:cNvGraphicFramePr>
+					<a:graphicFrameLocks
+						xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"
+						noChangeAspect="1" />
+				</wp:cNvGraphicFramePr>
+				<a:graphic
+					xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">
+					<a:graphicData
+						uri="http://schemas.openxmlformats.org/drawingml/2006/picture">
+						<pic:pic
+							xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture">
+							<pic:nvPicPr>
+								<pic:cNvPr id="1" name="" />
+								<pic:cNvPicPr />
+							</pic:nvPicPr>
+							<pic:blipFill>
+								<a:blip r:embed="${element.params.rid}" />
+								<a:stretch>
+									<a:fillRect />
+								</a:stretch>
+							</pic:blipFill>
+							<pic:spPr>
+								<a:xfrm>
+									<a:off x="0" y="0" />
+									<a:ext cx="${element.params.width}"
+										cy="${element.params.height}" />
+								</a:xfrm>
+								<a:prstGeom prst="rect">
+									<a:avLst />
+								</a:prstGeom>
+							</pic:spPr>
+						</pic:pic>
+					</a:graphicData>
+				</a:graphic>
+			</wp:inline>
+		</w:drawing>
+	</w:r>
+	<#else>
+	<w:r w:rsidRPr="003A4B1C">
+		<w:rPr>
+			<w:rFonts w:hint="eastAsia" />
+		</w:rPr>
+		<w:t>${element.value}</w:t>
+	</w:r>
+	</#if>
+	</#list>
+</w:p>
+</#list>
+</#if>
+		<w:sectPr w:rsidR="008C75CD" w:rsidSect="001205CF">
+			<w:pgSz w:h="16838" w:w="11906" />
+			<w:pgMar w:bottom="1440" w:footer="992" w:gutter="0"
+				w:header="851" w:left="1800" w:right="1800" w:top="1440" />
+			<w:cols w:space="425" />
+			<w:docGrid w:linePitch="312" w:type="lines" />
+		</w:sectPr>
+	</w:body>
+</w:document>

+ 97 - 0
examcloud-core-questions-base/src/main/resources/export_template/origin_paper/question_options.ftl

@@ -0,0 +1,97 @@
+<#setting number_format="#">
+<#list options as option>
+<#list option.jsections as section>
+<w:p w:rsidR="00F62967" w:rsidRPr="003A4B1C"
+	w:rsidRDefault="00F62967" w:rsidP="00F62967">
+	<#if option.cols == 4>
+	<w:pPr>
+        <w:tabs>
+            <w:tab w:val="left" w:pos="2268"/>
+            <w:tab w:val="left" w:pos="4536"/>
+            <w:tab w:val="left" w:pos="7230"/>
+        </w:tabs>
+    </w:pPr>
+    </#if>
+    <#if option.cols == 2>
+	<w:pPr>
+        <w:tabs>
+            <w:tab w:val="left" w:pos="4536"/>
+        </w:tabs>
+    </w:pPr>
+    </#if>    
+	<#if section_index != 0>
+	<w:pPr>
+		<w:autoSpaceDE w:val="false" />
+		<w:autoSpaceDN w:val="false" />
+		<w:adjustRightInd w:val="false" />
+		<w:ind w:firstLine="424" w:firstLineChars="202" />
+		<w:jc w:val="left" />
+	</w:pPr>
+	</#if>
+	<#list section.elements as element>
+	<#if element.type="image">
+	<w:r>
+		<w:rPr>
+			<w:noProof />
+		</w:rPr>
+		<w:drawing>
+			<wp:inline distT="0" distB="0" distL="0" distR="0">
+				<wp:extent cx="${element.params.width}"
+					cy="${element.params.height}" />
+				<wp:effectExtent l="0" t="0" r="0" b="0" />
+				<wp:docPr id="${element.params.index}"
+					name="图片 ${element.params.index}" />
+				<wp:cNvGraphicFramePr>
+					<a:graphicFrameLocks
+						xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"
+						noChangeAspect="1" />
+				</wp:cNvGraphicFramePr>
+				<a:graphic
+					xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">
+					<a:graphicData
+						uri="http://schemas.openxmlformats.org/drawingml/2006/picture">
+						<pic:pic
+							xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture">
+							<pic:nvPicPr>
+								<pic:cNvPr id="1" name="" />
+								<pic:cNvPicPr />
+							</pic:nvPicPr>
+							<pic:blipFill>
+								<a:blip r:embed="${element.params.rid}" />
+								<a:stretch>
+									<a:fillRect />
+								</a:stretch>
+							</pic:blipFill>
+							<pic:spPr>
+								<a:xfrm>
+									<a:off x="0" y="0" />
+									<a:ext cx="${element.params.width}"
+										cy="${element.params.height}" />
+								</a:xfrm>
+								<a:prstGeom prst="rect">
+									<a:avLst />
+								</a:prstGeom>
+							</pic:spPr>
+						</pic:pic>
+					</a:graphicData>
+				</a:graphic>
+			</wp:inline>
+		</w:drawing>
+	</w:r>
+	<#else>
+	<#if element.params?exists&&element.params.tab>
+	<w:r>
+        <w:tab/>
+    </w:r>
+    </#if>
+	<w:r w:rsidRPr="003A4B1C">
+		<w:rPr>
+			<w:rFonts w:hint="eastAsia" />
+		</w:rPr>
+		<w:t>${element.value}</w:t>
+	</w:r>
+	</#if>
+	</#list>
+</w:p>
+</#list>
+</#list>

+ 12 - 0
examcloud-core-questions-dao/src/main/java/cn/com/qmth/examcloud/core/questions/dao/entity/Question.java

@@ -38,6 +38,8 @@ public class Question extends IdBase {
     private String quesAnswerAnalysisWord;// 答案word解析
 
     private List<QuesOption> quesOptions;// 试题选项
+    
+    private String quesOptionsWord;//试题选项word解析
 
     private List<QuesResource> quesResource;// 试题resource(试题资源库集合,适用于多媒体介质试题)
 
@@ -417,4 +419,14 @@ public class Question extends IdBase {
         this.answerType = answerType;
     }
 
+    
+    public String getQuesOptionsWord() {
+        return quesOptionsWord;
+    }
+
+    
+    public void setQuesOptionsWord(String quesOptionsWord) {
+        this.quesOptionsWord = quesOptionsWord;
+    }
+
 }

+ 9 - 9
examcloud-core-questions-dao/src/main/java/cn/com/qmth/examcloud/core/questions/dao/entity/QuestionBak.java

@@ -1,13 +1,13 @@
 package cn.com.qmth.examcloud.core.questions.dao.entity;
 
+import java.util.List;
+import java.util.Map;
+
+import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
+
 import cn.com.qmth.examcloud.core.questions.base.CommonUtils;
 import cn.com.qmth.examcloud.core.questions.base.question.enums.QuesStructType;
-import cn.com.qmth.examcloud.core.questions.base.word.DocxProcessUtil;
 import cn.com.qmth.examcloud.core.questions.dao.entity.base.IdBase;
-import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
-
-import java.util.List;
-import java.util.Map;
 
 public class QuestionBak extends IdBase {
 
@@ -156,11 +156,11 @@ public class QuestionBak extends IdBase {
     }
 
     public WordprocessingMLPackage getPkgObj() {
-        if (this.quesPkg != null && this.quesPkg.length > 0) {
-            return DocxProcessUtil.getPkg(this.quesPkg);
-        } else {
+//        if (this.quesPkg != null && this.quesPkg.length > 0) {
+//            return DocxProcessUtil.getPkg(this.quesPkg);
+//        } else {
             return null;
-        }
+//        }
 
     }
 

+ 1 - 1
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/ExportPaperService.java

@@ -41,6 +41,6 @@ public interface ExportPaperService {
      */
     public void downOriginalPaper(String paperId, String loginName, HttpServletResponse response) throws Exception;
 
-    public void downOriginalPaperPlus(String paperId, String loginName, HttpServletResponse response) throws Exception;
+    public void downOriginalPaperPlus(String paperId, Long rootOrgId, HttpServletResponse response) throws Exception;
 
 }

+ 4 - 0
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/ExportTemplateService.java

@@ -1,5 +1,7 @@
 package cn.com.qmth.examcloud.core.questions.service;
 
+import java.io.File;
+
 import org.springframework.data.domain.Page;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -19,6 +21,8 @@ public interface ExportTemplateService {
 
     void addFile(User user, String templateName, String type, MultipartFile dataFile);
 
+    File getExportTemplateDirectory(ExportTemplateType type, Long rootOrgId);
+
     String getExportTemplateName(ExportTemplateType type, Long rootOrgId);
 
 }

+ 5 - 2
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/ImportDdCollegePaperService.java

@@ -57,7 +57,7 @@ import cn.com.qmth.examcloud.core.questions.service.temp.vo.TestOptionGroup;
 import cn.com.qmth.examcloud.core.questions.service.temp.vo.TestPaper;
 import cn.com.qmth.examcloud.core.questions.service.temp.vo.TestQuestion;
 import cn.com.qmth.examcloud.core.questions.service.temp.vo.TestQuestionInfo;
-import cn.com.qmth.examcloud.web.bootstrap.PropertyHolder;
+import cn.com.qmth.examcloud.web.config.SystemProperties;
 
 @Service
 public class ImportDdCollegePaperService {
@@ -84,9 +84,12 @@ public class ImportDdCollegePaperService {
 
     @Autowired
     private QuesPkgPathRepo quesPkgPathRepo;
+    
+    @Autowired
+    private SystemProperties systemProperties;
 
     public void importDdCollegePaper(MultipartFile dataFile, User user, Long rootOrgId) {
-        String tempDir = PropertyHolder.getString("examcloud.web.sys.tempDataDir");
+        String tempDir = systemProperties.getTempDataDir();
         String dir = tempDir + File.separator + UUID.randomUUID() + File.separator;
         try {
             File dfile = new File(dir);

+ 8 - 8
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/QuesService.java

@@ -1,16 +1,16 @@
 package cn.com.qmth.examcloud.core.questions.service;
 
+import java.util.List;
+import java.util.Set;
+
+import org.springframework.data.domain.Page;
+import org.springframework.stereotype.Service;
+
 import cn.com.qmth.examcloud.api.commons.security.bean.User;
 import cn.com.qmth.examcloud.core.questions.base.question.enums.QuesStructType;
 import cn.com.qmth.examcloud.core.questions.dao.entity.Question;
 import cn.com.qmth.examcloud.core.questions.dao.entity.QuestionSearchCondition;
 import cn.com.qmth.examcloud.core.questions.service.bean.QuestionAnswerBean;
-import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
-import org.springframework.data.domain.Page;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-import java.util.Set;
 
 /**
  * Created by songyue on 16/12/28.
@@ -76,9 +76,9 @@ public interface QuesService {
      *
      * @param question
      */
-    public void updateQuesWord(Question question);
+//    public void updateQuesWord(Question question);
 
-    public void updateQuesWordUnit(WordprocessingMLPackage wordMLPackage, Question question) throws Exception;
+//    public void updateQuesWordUnit(WordprocessingMLPackage wordMLPackage, Question question) throws Exception;
 
     /**
      * 获取试题有效文本

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

@@ -3,7 +3,6 @@ package cn.com.qmth.examcloud.core.questions.service.export;
 import java.io.File;
 import java.util.List;
 
-import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
 import org.springframework.stereotype.Service;
 
 import cn.com.qmth.examcloud.api.commons.security.bean.User;
@@ -11,12 +10,12 @@ import cn.com.qmth.examcloud.core.questions.base.CommonUtils;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExamFileType;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExportTemplateType;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExportType;
-import cn.com.qmth.examcloud.core.questions.base.word.DocxProcessUtil;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExamPaper;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExportStructure;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExtractConfig;
 import cn.com.qmth.examcloud.core.questions.dao.entity.QuestionTypeNum;
 import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperExp;
+import cn.com.qmth.examcloud.core.questions.service.util.ExportPaperUtil;
 
 /**
  * @author weiwenhai
@@ -33,15 +32,17 @@ public class BjhkExportPaperService extends ExportPaperAbstractService {
         if (paperExp != null) {
             String paperfileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
                     + ExamFileType.PAPER.getName() + DOCX_SUFFIX;
-            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
-            if (OFFLINE.equals(examType)) {
-                WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
-                paperExp.setExamRemarkWord(
-                        DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(paperExp.getExamRemark())));
-            }
+//            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
+//            if (OFFLINE.equals(examType)) {
+//                WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
+//                paperExp.setExamRemarkWord(
+//                        DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(paperExp.getExamRemark())));
+//            }
 
-            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT));
-            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, getPkgList(paperId));
+//            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT));
+//            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, getPkgList(paperId));
+            File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
+            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,paperfileName, ExportTemplateType.PAPER_EXPORT);
             // 下载音频
             super.downloadAudio(paperExp, zipFileName);
         }
@@ -53,16 +54,17 @@ public class BjhkExportPaperService extends ExportPaperAbstractService {
         if (paperExp != null) {
             String answerFileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
                     + ExamFileType.ANSWER.getName() + DOCX_SUFFIX;
-            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + answerFileName);
-            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT));
-            DocxProcessUtil.processImage(zipFileName + File.separator + answerFileName, getPkgList(paperId));
+//            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + answerFileName);
+//            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT));
+//            DocxProcessUtil.processImage(zipFileName + File.separator + answerFileName, getPkgList(paperId));
+            File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
+            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,answerFileName, ExportTemplateType.ANWSER_EXPORT);
         }
     }
 
     @Override
     public void uploadFile(ExtractConfig extractConfig, String paperId, ExportStructure exportStructure,
             User accessUser, ExamPaper examPaper) throws Exception {
-        Long rootOrgId = accessUser.getRootOrgId();
         PaperExp paperExp = initPaperExp(paperId);
         if (paperExp != null) {
             String currNum = CommonUtils.getCurNum();
@@ -77,21 +79,17 @@ public class BjhkExportPaperService extends ExportPaperAbstractService {
             // 没有试卷结构导出设置
             if (exportStructure == null) {
                 // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT), ExamFileType.PAPER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, examPaper);
                 // 上传答案
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT), ExamFileType.ANSWER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.ANWSER_EXPORT, ExamFileType.ANSWER, examPaper);
             } else if (exportStructure != null && exportStructure.getExportType() == ExportType.NORMAL) {
                 List<QuestionTypeNum> questionTypeNums = exportStructure.getQuestionTypeNums();
                 // 检查试卷中客观题的数量是否大于试卷导出设置中的设置的数量
                 checkObjectiveDetailsNum(paperExp, questionTypeNums);
                 // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT), ExamFileType.PAPER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, examPaper);
                 // 上传答案
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT), ExamFileType.ANSWER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.ANWSER_EXPORT, ExamFileType.ANSWER, examPaper);
                 // 上传试卷结构 不能在上传试卷和答案之前
                 uploadPaperStructure(paperExp, extractConfig, accessUser, currNum, questionTypeNums, examPaper);
             } else if (exportStructure != null && exportStructure.getExportType() == ExportType.ONLINE) {

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

@@ -10,12 +10,12 @@ import cn.com.qmth.examcloud.core.questions.base.CommonUtils;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExamFileType;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExportTemplateType;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExportType;
-import cn.com.qmth.examcloud.core.questions.base.word.DocxProcessUtil;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExamPaper;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExportStructure;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExtractConfig;
 import cn.com.qmth.examcloud.core.questions.dao.entity.QuestionTypeNum;
 import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperExp;
+import cn.com.qmth.examcloud.core.questions.service.util.ExportPaperUtil;
 
 @Service("bjjtExportPaperService")
 public class BjjtExportPaperService extends ExportPaperAbstractService {
@@ -26,11 +26,13 @@ public class BjjtExportPaperService extends ExportPaperAbstractService {
         if (paperExp != null) {
             String paperfileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
                     + ExamFileType.PAPER.getName() + DOCX_SUFFIX;
-            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
-
-            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT));
-
-            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, getPkgList(paperId));
+//            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
+//
+//            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT));
+//
+//            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, getPkgList(paperId));
+            File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
+            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,paperfileName, ExportTemplateType.PAPER_EXPORT);
         }
     }
 
@@ -40,16 +42,17 @@ public class BjjtExportPaperService extends ExportPaperAbstractService {
         if (paperExp != null) {
             String answerFileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
                     + ExamFileType.ANSWER.getName() + DOCX_SUFFIX;
-            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + answerFileName);
-            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT));
-            DocxProcessUtil.processImage(zipFileName + File.separator + answerFileName, getPkgList(paperId));
+//            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + answerFileName);
+//            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT));
+//            DocxProcessUtil.processImage(zipFileName + File.separator + answerFileName, getPkgList(paperId));
+            File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
+            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,answerFileName, ExportTemplateType.ANWSER_EXPORT);
         }
     }
 
     @Override
     public void uploadFile(ExtractConfig extractConfig, String paperId, ExportStructure exportStructure,
             User accessUser, ExamPaper examPaper) throws Exception {
-        Long rootOrgId = accessUser.getRootOrgId();
         PaperExp paperExp = initPaperExp(paperId);
         if (paperExp != null) {
             String currNum = CommonUtils.getCurNum();
@@ -64,21 +67,17 @@ public class BjjtExportPaperService extends ExportPaperAbstractService {
             // 没有试卷结构导出设置
             if (exportStructure == null) {
                 // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT), ExamFileType.PAPER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, examPaper);
                 // 上传答案
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT), ExamFileType.ANSWER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.ANWSER_EXPORT, ExamFileType.ANSWER, examPaper);
             } else if (exportStructure != null && exportStructure.getExportType() == ExportType.NORMAL) {
                 List<QuestionTypeNum> questionTypeNums = exportStructure.getQuestionTypeNums();
                 // 检查试卷中客观题的数量是否大于试卷导出设置中的设置的数量
                 checkObjectiveDetailsNum(paperExp, questionTypeNums);
                 // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT), ExamFileType.PAPER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, examPaper);
                 // 上传答案
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT), ExamFileType.ANSWER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.ANWSER_EXPORT, ExamFileType.ANSWER, examPaper);
                 // 上传试卷结构 不能在上传试卷和答案之前
                 uploadPaperStructure(paperExp, extractConfig, accessUser, currNum, questionTypeNums, examPaper);
             } else if (exportStructure != null && exportStructure.getExportType() == ExportType.ONLINE) {

+ 21 - 23
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/BjsfExportPaperService.java

@@ -3,7 +3,6 @@ package cn.com.qmth.examcloud.core.questions.service.export;
 import java.io.File;
 import java.util.List;
 
-import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
 import org.springframework.stereotype.Service;
 
 import cn.com.qmth.examcloud.api.commons.security.bean.User;
@@ -11,12 +10,12 @@ import cn.com.qmth.examcloud.core.questions.base.CommonUtils;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExamFileType;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExportTemplateType;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExportType;
-import cn.com.qmth.examcloud.core.questions.base.word.DocxProcessUtil;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExamPaper;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExportStructure;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExtractConfig;
 import cn.com.qmth.examcloud.core.questions.dao.entity.QuestionTypeNum;
 import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperExp;
+import cn.com.qmth.examcloud.core.questions.service.util.ExportPaperUtil;
 
 /**
  * @author weiwenhai
@@ -33,15 +32,17 @@ public class BjsfExportPaperService extends ExportPaperAbstractService {
         if (paperExp != null) {
             String paperfileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
                     + ExamFileType.PAPER.getName() + DOCX_SUFFIX;
-            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
-            if (OFFLINE.equals(examType)) {
-                WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
-                paperExp.setExamRemarkWord(
-                        DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(paperExp.getExamRemark())));
-            }
-            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT));
-
-            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, getPkgList(paperId));
+//            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
+//            if (OFFLINE.equals(examType)) {
+//                WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
+//                paperExp.setExamRemarkWord(
+//                        DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(paperExp.getExamRemark())));
+//            }
+//            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT));
+//
+//            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, getPkgList(paperId));
+            File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
+            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,paperfileName, ExportTemplateType.PAPER_EXPORT);
             // 下载音频
             super.downloadAudio(paperExp, zipFileName);
         }
@@ -53,16 +54,17 @@ public class BjsfExportPaperService extends ExportPaperAbstractService {
         if (paperExp != null) {
             String answerFileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
                     + ExamFileType.ANSWER.getName() + DOCX_SUFFIX;
-            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + answerFileName);
-            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT));
-            DocxProcessUtil.processImage(zipFileName + File.separator + answerFileName, getPkgList(paperId));
+//            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + answerFileName);
+//            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT));
+//            DocxProcessUtil.processImage(zipFileName + File.separator + answerFileName, getPkgList(paperId));
+            File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
+            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,answerFileName, ExportTemplateType.ANWSER_EXPORT);
         }
     }
 
     @Override
     public void uploadFile(ExtractConfig extractConfig, String paperId, ExportStructure exportStructure,
             User accessUser, ExamPaper examPaper) throws Exception {
-        Long rootOrgId = accessUser.getRootOrgId();
         PaperExp paperExp = initPaperExp(paperId);
         if (paperExp != null) {
             String currNum = CommonUtils.getCurNum();
@@ -77,21 +79,17 @@ public class BjsfExportPaperService extends ExportPaperAbstractService {
             // 没有试卷结构导出设置
             if (exportStructure == null) {
                 // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT), ExamFileType.PAPER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, examPaper);
                 // 上传答案
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT), ExamFileType.ANSWER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.ANWSER_EXPORT, ExamFileType.ANSWER, examPaper);
             } else if (exportStructure != null && exportStructure.getExportType() == ExportType.NORMAL) {
                 List<QuestionTypeNum> questionTypeNums = exportStructure.getQuestionTypeNums();
                 // 检查试卷中客观题的数量是否大于试卷导出设置中的设置的数量
                 checkObjectiveDetailsNum(paperExp, questionTypeNums);
                 // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT), ExamFileType.PAPER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, examPaper);
                 // 上传答案
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT), ExamFileType.ANSWER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.ANWSER_EXPORT, ExamFileType.ANSWER, examPaper);
                 // 上传试卷结构 不能在上传试卷和答案之前
                 uploadPaperStructure(paperExp, extractConfig, accessUser, currNum, questionTypeNums, examPaper);
             } else if (exportStructure != null && exportStructure.getExportType() == ExportType.ONLINE) {

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

@@ -1,15 +1,5 @@
 package cn.com.qmth.examcloud.core.questions.service.export;
 
-import cn.com.qmth.examcloud.core.questions.base.CommonUtils;
-import cn.com.qmth.examcloud.core.questions.dao.AudioTimeConfigRepo;
-import cn.com.qmth.examcloud.core.questions.dao.entity.*;
-import cn.com.qmth.examcloud.core.questions.dao.entity.computerTestModel.*;
-import cn.com.qmth.examcloud.core.questions.service.PaperDetailService;
-import cn.com.qmth.examcloud.core.questions.service.PaperService;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -17,6 +7,28 @@ import java.util.Map;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import cn.com.qmth.examcloud.core.questions.base.CommonUtils;
+import cn.com.qmth.examcloud.core.questions.dao.entity.ExamPaper;
+import cn.com.qmth.examcloud.core.questions.dao.entity.ExtractConfig;
+import cn.com.qmth.examcloud.core.questions.dao.entity.Paper;
+import cn.com.qmth.examcloud.core.questions.dao.entity.PaperDetail;
+import cn.com.qmth.examcloud.core.questions.dao.entity.PaperDetailUnit;
+import cn.com.qmth.examcloud.core.questions.dao.entity.QuesOption;
+import cn.com.qmth.examcloud.core.questions.dao.entity.Question;
+import cn.com.qmth.examcloud.core.questions.dao.entity.computerTestModel.Block;
+import cn.com.qmth.examcloud.core.questions.dao.entity.computerTestModel.ComputerTestOption;
+import cn.com.qmth.examcloud.core.questions.dao.entity.computerTestModel.ComputerTestPaper;
+import cn.com.qmth.examcloud.core.questions.dao.entity.computerTestModel.ComputerTestPaperDetail;
+import cn.com.qmth.examcloud.core.questions.dao.entity.computerTestModel.ComputerTestQuestion;
+import cn.com.qmth.examcloud.core.questions.dao.entity.computerTestModel.Section;
+import cn.com.qmth.examcloud.core.questions.dao.entity.computerTestModel.Sections;
+import cn.com.qmth.examcloud.core.questions.service.PaperDetailService;
+import cn.com.qmth.examcloud.core.questions.service.PaperService;
+
 /**
  * @author chenken
  * @date 2017年10月24日 下午2:29:09
@@ -32,9 +44,6 @@ public class BuildComputerTestJsonService {
     @Autowired
     private PaperDetailService paperDetailService;
 
-    @Autowired
-    private AudioTimeConfigRepo audioTimeConfigRepo;
-
     /**
      * 根据调卷规则构建机考数据包实体类
      *

+ 21 - 23
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/CqdxExportPaperService.java

@@ -4,7 +4,6 @@ import java.io.File;
 import java.util.List;
 
 import org.apache.commons.collections.CollectionUtils;
-import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
 import org.springframework.stereotype.Service;
 
 import cn.com.qmth.examcloud.api.commons.security.bean.User;
@@ -13,13 +12,13 @@ import cn.com.qmth.examcloud.core.questions.base.enums.ExamFileType;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExportTemplateType;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExportType;
 import cn.com.qmth.examcloud.core.questions.base.question.enums.QuesStructType;
-import cn.com.qmth.examcloud.core.questions.base.word.DocxProcessUtil;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExamPaper;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExportStructure;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExtractConfig;
 import cn.com.qmth.examcloud.core.questions.dao.entity.QuestionTypeNum;
 import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperDetailExp;
 import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperExp;
+import cn.com.qmth.examcloud.core.questions.service.util.ExportPaperUtil;
 
 /**
  * @author weiwenhai
@@ -36,15 +35,17 @@ public class CqdxExportPaperService extends ExportPaperAbstractService {
         if (paperExp != null) {
             String paperfileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
                     + ExamFileType.PAPER.getName() + DOCX_SUFFIX;
-            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
-            if (OFFLINE.equals(examType)) {
-                WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
-                paperExp.setExamRemarkWord(
-                        DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(paperExp.getExamRemark())));
-            }
-            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT));
-
-            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, getPkgList(paperId));
+//            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
+//            if (OFFLINE.equals(examType)) {
+//                WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
+//                paperExp.setExamRemarkWord(
+//                        DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(paperExp.getExamRemark())));
+//            }
+//            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT));
+//
+//            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, getPkgList(paperId));
+            File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
+            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,paperfileName, ExportTemplateType.PAPER_EXPORT);
             // 下载音频
             super.downloadAudio(paperExp, zipFileName);
         }
@@ -56,9 +57,11 @@ public class CqdxExportPaperService extends ExportPaperAbstractService {
         if (paperExp != null) {
             String answerFileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
                     + ExamFileType.ANSWER.getName() + DOCX_SUFFIX;
-            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + answerFileName);
-            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT));
-            DocxProcessUtil.processImage(zipFileName + File.separator + answerFileName, getPkgList(paperId));
+//            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + answerFileName);
+//            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT));
+//            DocxProcessUtil.processImage(zipFileName + File.separator + answerFileName, getPkgList(paperId));
+            File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
+            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,answerFileName, ExportTemplateType.ANWSER_EXPORT);
         }
     }
 
@@ -110,7 +113,6 @@ public class CqdxExportPaperService extends ExportPaperAbstractService {
     @Override
     public void uploadFile(ExtractConfig extractConfig, String paperId, ExportStructure exportStructure,
             User accessUser, ExamPaper examPaper) throws Exception {
-        Long rootOrgId = accessUser.getRootOrgId();
         PaperExp paperExp = initPaperExp(paperId);
         if (paperExp != null) {
             String currNum = CommonUtils.getCurNum();
@@ -125,21 +127,17 @@ public class CqdxExportPaperService extends ExportPaperAbstractService {
             // 没有试卷结构导出设置
             if (exportStructure == null) {
                 // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT), ExamFileType.PAPER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, examPaper);
                 // 上传答案
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT), ExamFileType.ANSWER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.ANWSER_EXPORT, ExamFileType.ANSWER, examPaper);
             } else if (exportStructure != null && exportStructure.getExportType() == ExportType.NORMAL) {
                 List<QuestionTypeNum> questionTypeNums = exportStructure.getQuestionTypeNums();
                 // 检查试卷中客观题的数量是否大于试卷导出设置中的设置的数量
                 checkObjectiveDetailsNum(paperExp, questionTypeNums);
                 // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT), ExamFileType.PAPER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, examPaper);
                 // 上传答案
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT), ExamFileType.ANSWER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.ANWSER_EXPORT, ExamFileType.ANSWER, examPaper);
                 // 上传试卷结构 不能在上传试卷和答案之前
                 uploadPaperStructure(paperExp, extractConfig, accessUser, currNum, questionTypeNums, examPaper);
             } else if (exportStructure != null && exportStructure.getExportType() == ExportType.ONLINE) {

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

@@ -9,7 +9,6 @@ package cn.com.qmth.examcloud.core.questions.service.export;
 import java.io.File;
 import java.util.List;
 
-import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
 import org.springframework.stereotype.Service;
 
 import cn.com.qmth.examcloud.api.commons.security.bean.User;
@@ -19,12 +18,12 @@ import cn.com.qmth.examcloud.core.questions.base.CommonUtils;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExamFileType;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExportTemplateType;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExportType;
-import cn.com.qmth.examcloud.core.questions.base.word.DocxProcessUtil;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExamPaper;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExportStructure;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExtractConfig;
 import cn.com.qmth.examcloud.core.questions.dao.entity.QuestionTypeNum;
 import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperExp;
+import cn.com.qmth.examcloud.core.questions.service.util.ExportPaperUtil;
 
 /**
  * 中国地质大学(北京)
@@ -47,16 +46,18 @@ public class CugbExportPaperService extends ExportPaperAbstractService {
         if (paperExp != null) {
             String paperfileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
                     + ExamFileType.PAPER.getName() + DOCX_SUFFIX;
-            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
-            if (OFFLINE.equals(examType)) {
-                WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
-                paperExp.setExamRemarkWord(
-                        DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(paperExp.getExamRemark())));
-            }
-            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT));
+//            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
+//            if (OFFLINE.equals(examType)) {
+//                WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
+//                paperExp.setExamRemarkWord(
+//                        DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(paperExp.getExamRemark())));
+//            }
+//            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT));
 
             long docxImgTime = System.currentTimeMillis();
-            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, getPkgList(paperId));
+//            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, getPkgList(paperId));
+            File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
+            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,paperfileName, ExportTemplateType.PAPER_EXPORT);
             long docxImgEndTime = System.currentTimeMillis();
             log.debug("处理word文字+图片耗时:" + (docxImgEndTime - docxImgTime) + "ms");
             // 下载音频
@@ -76,10 +77,12 @@ public class CugbExportPaperService extends ExportPaperAbstractService {
         if (paperExp != null) {
             String answerFileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
                     + ExamFileType.ANSWER.getName() + DOCX_SUFFIX;
-            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + answerFileName);
+//            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + answerFileName);
             long docxTime = System.currentTimeMillis();
-            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT));
-            DocxProcessUtil.processImage(zipFileName + File.separator + answerFileName, getPkgList(paperId));
+//            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT));
+//            DocxProcessUtil.processImage(zipFileName + File.separator + answerFileName, getPkgList(paperId));
+            File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
+            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,answerFileName, ExportTemplateType.ANWSER_EXPORT);
             long docxEndTime = System.currentTimeMillis();
             log.debug("处理word文字+图片耗时:" + (docxEndTime - docxTime) + "ms");
         }
@@ -88,7 +91,6 @@ public class CugbExportPaperService extends ExportPaperAbstractService {
     @Override
     public void uploadFile(ExtractConfig extractConfig, String paperId, ExportStructure exportStructure,
             User accessUser, ExamPaper examPaper) throws Exception {
-        Long rootOrgId = accessUser.getRootOrgId();
         PaperExp paperExp = initPaperExp(paperId);
         if (paperExp != null) {
             String currNum = CommonUtils.getCurNum();
@@ -103,21 +105,17 @@ public class CugbExportPaperService extends ExportPaperAbstractService {
             // 没有试卷结构导出设置
             if (exportStructure == null) {
                 // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT), ExamFileType.PAPER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, examPaper);
                 // 上传答案
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT), ExamFileType.ANSWER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.ANWSER_EXPORT, ExamFileType.ANSWER, examPaper);
             } else if (exportStructure != null && exportStructure.getExportType() == ExportType.NORMAL) {
                 List<QuestionTypeNum> questionTypeNums = exportStructure.getQuestionTypeNums();
                 // 检查试卷中客观题的数量是否大于试卷导出设置中的设置的数量
                 checkObjectiveDetailsNum(paperExp, questionTypeNums);
                 // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT), ExamFileType.PAPER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, examPaper);
                 // 上传答案
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT), ExamFileType.ANSWER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.ANWSER_EXPORT, ExamFileType.ANSWER, examPaper);
                 // 上传试卷结构 不能在上传试卷和答案之前
                 uploadPaperStructure(paperExp, extractConfig, accessUser, currNum, questionTypeNums, examPaper);
             } else if (exportStructure != null && exportStructure.getExportType() == ExportType.ONLINE) {

+ 21 - 23
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/DbsfExportPaperService.java

@@ -3,7 +3,6 @@ package cn.com.qmth.examcloud.core.questions.service.export;
 import java.io.File;
 import java.util.List;
 
-import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
 import org.springframework.stereotype.Service;
 
 import cn.com.qmth.examcloud.api.commons.security.bean.User;
@@ -11,12 +10,12 @@ import cn.com.qmth.examcloud.core.questions.base.CommonUtils;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExamFileType;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExportTemplateType;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExportType;
-import cn.com.qmth.examcloud.core.questions.base.word.DocxProcessUtil;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExamPaper;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExportStructure;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExtractConfig;
 import cn.com.qmth.examcloud.core.questions.dao.entity.QuestionTypeNum;
 import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperExp;
+import cn.com.qmth.examcloud.core.questions.service.util.ExportPaperUtil;
 
 /**
  * @author weiwenhai
@@ -33,15 +32,17 @@ public class DbsfExportPaperService extends ExportPaperAbstractService {
         if (paperExp != null) {
             String paperfileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
                     + ExamFileType.PAPER.getName() + DOCX_SUFFIX;
-            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
-            if (OFFLINE.equals(examType)) {
-                WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
-                paperExp.setExamRemarkWord(
-                        DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(paperExp.getExamRemark())));
-            }
-
-            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT));
-            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, getPkgList(paperId));
+//            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
+//            if (OFFLINE.equals(examType)) {
+//                WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
+//                paperExp.setExamRemarkWord(
+//                        DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(paperExp.getExamRemark())));
+//            }
+//
+//            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT));
+//            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, getPkgList(paperId));
+            File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
+            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,paperfileName, ExportTemplateType.PAPER_EXPORT);
             // 下载音频
             super.downloadAudio(paperExp, zipFileName);
         }
@@ -53,16 +54,17 @@ public class DbsfExportPaperService extends ExportPaperAbstractService {
         if (paperExp != null) {
             String answerFileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
                     + ExamFileType.ANSWER.getName() + DOCX_SUFFIX;
-            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + answerFileName);
-            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT));
-            DocxProcessUtil.processImage(zipFileName + File.separator + answerFileName, getPkgList(paperId));
+//            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + answerFileName);
+//            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT));
+//            DocxProcessUtil.processImage(zipFileName + File.separator + answerFileName, getPkgList(paperId));
+            File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
+            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,answerFileName, ExportTemplateType.ANWSER_EXPORT);
         }
     }
 
     @Override
     public void uploadFile(ExtractConfig extractConfig, String paperId, ExportStructure exportStructure,
             User accessUser, ExamPaper examPaper) throws Exception {
-        Long rootOrgId = accessUser.getRootOrgId();
         PaperExp paperExp = initPaperExp(paperId);
         if (paperExp != null) {
             String currNum = CommonUtils.getCurNum();
@@ -77,21 +79,17 @@ public class DbsfExportPaperService extends ExportPaperAbstractService {
             // 没有试卷结构导出设置
             if (exportStructure == null) {
                 // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT), ExamFileType.PAPER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, examPaper);
                 // 上传答案
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT), ExamFileType.ANSWER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.ANWSER_EXPORT, ExamFileType.ANSWER, examPaper);
             } else if (exportStructure != null && exportStructure.getExportType() == ExportType.NORMAL) {
                 List<QuestionTypeNum> questionTypeNums = exportStructure.getQuestionTypeNums();
                 // 检查试卷中客观题的数量是否大于试卷导出设置中的设置的数量
                 checkObjectiveDetailsNum(paperExp, questionTypeNums);
                 // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT), ExamFileType.PAPER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, examPaper);
                 // 上传答案
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT), ExamFileType.ANSWER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.ANWSER_EXPORT, ExamFileType.ANSWER, examPaper);
                 // 上传试卷结构 不能在上传试卷和答案之前
                 uploadPaperStructure(paperExp, extractConfig, accessUser, currNum, questionTypeNums, examPaper);
             } else if (exportStructure != null && exportStructure.getExportType() == ExportType.ONLINE) {

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

@@ -18,7 +18,6 @@ import cn.com.qmth.examcloud.core.questions.base.enums.ExamFileType;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExportTemplateType;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExportType;
 import cn.com.qmth.examcloud.core.questions.base.question.enums.QuesStructType;
-import cn.com.qmth.examcloud.core.questions.base.word.DocxProcessUtil;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExamPaper;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExportStructure;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExtractConfig;
@@ -27,6 +26,7 @@ import cn.com.qmth.examcloud.core.questions.dao.entity.QuestionTypeNum;
 import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperDetailExp;
 import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperDetailUnitExp;
 import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperExp;
+import cn.com.qmth.examcloud.core.questions.service.util.ExportPaperUtil;
 
 /**
  * @author chenken
@@ -44,22 +44,26 @@ public class DzkdExportPaperService extends ExportPaperAbstractService {
         if (paperExp != null) {
             String paperfileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
                     + ExamFileType.PAPER.getName() + DOCX_SUFFIX;
-            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
-            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT));
-            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, getPkgList(paperId));
+//            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
+//            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT));
+//            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, getPkgList(paperId));
+            File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
+            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,paperfileName, ExportTemplateType.PAPER_EXPORT);
         }
     }
 
     public void downloadPaperAnswer(Long rootOrgId, String paperId, String zipFileName) throws Exception {
         PaperExp paperExp = initPaperExp(paperId);
-        // 电子科大独有
-        setSplitPaperDetailExp(paperExp, paperExp.getPaperDetails());
         if (paperExp != null) {
+            // 电子科大独有
+            setSplitPaperDetailExp(paperExp, paperExp.getPaperDetails());
             String answerFileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
                     + ExamFileType.ANSWER.getName() + DOCX_SUFFIX;
-            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + answerFileName);
-            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT));
-            DocxProcessUtil.processImage(zipFileName + File.separator + answerFileName, getPkgList(paperId));
+//            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + answerFileName);
+//            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT));
+//            DocxProcessUtil.processImage(zipFileName + File.separator + answerFileName, getPkgList(paperId));
+            File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
+            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,answerFileName, ExportTemplateType.ANWSER_EXPORT);
         }
     }
 
@@ -308,7 +312,6 @@ public class DzkdExportPaperService extends ExportPaperAbstractService {
     @Override
     public void uploadFile(ExtractConfig extractConfig, String paperId, ExportStructure exportStructure,
             User accessUser, ExamPaper examPaper) throws Exception {
-        Long rootOrgId = accessUser.getRootOrgId();
         PaperExp paperExp = initPaperExp(paperId);
         setSplitPaperDetailExp(paperExp, paperExp.getPaperDetails());
         if (paperExp != null) {
@@ -316,21 +319,17 @@ public class DzkdExportPaperService extends ExportPaperAbstractService {
             // 没有试卷结构导出设置
             if (exportStructure == null) {
                 // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT), ExamFileType.PAPER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, examPaper);
                 // 上传答案
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT), ExamFileType.ANSWER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.ANWSER_EXPORT, ExamFileType.ANSWER, examPaper);
             } else if (exportStructure != null && exportStructure.getExportType() == ExportType.NORMAL) {
                 List<QuestionTypeNum> questionTypeNums = exportStructure.getQuestionTypeNums();
                 // 检查试卷中客观题的数量是否大于试卷导出设置中的设置的数量
                 checkObjectiveDetailsNum(paperExp, questionTypeNums);
                 // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT), ExamFileType.PAPER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, examPaper);
                 // 上传答案
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT), ExamFileType.ANSWER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.ANWSER_EXPORT, ExamFileType.ANSWER, examPaper);
                 // 上传试卷结构 不能在上传试卷和答案之前
                 uploadPaperStructure(paperExp, extractConfig, accessUser, currNum, questionTypeNums, examPaper);
             } else if (exportStructure != null && exportStructure.getExportType() == ExportType.ONLINE) {

File diff suppressed because it is too large
+ 448 - 466
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/ExportPaperAbstractService.java


+ 21 - 23
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/FdsfExportPaperService.java

@@ -9,7 +9,6 @@ package cn.com.qmth.examcloud.core.questions.service.export;
 import java.io.File;
 import java.util.List;
 
-import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
 import org.springframework.stereotype.Service;
 
 import cn.com.qmth.examcloud.api.commons.security.bean.User;
@@ -19,12 +18,12 @@ import cn.com.qmth.examcloud.core.questions.base.CommonUtils;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExamFileType;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExportTemplateType;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExportType;
-import cn.com.qmth.examcloud.core.questions.base.word.DocxProcessUtil;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExamPaper;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExportStructure;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExtractConfig;
 import cn.com.qmth.examcloud.core.questions.dao.entity.QuestionTypeNum;
 import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperExp;
+import cn.com.qmth.examcloud.core.questions.service.util.ExportPaperUtil;
 
 /**
  * 华东师范大学 题库导出、上传服务类
@@ -44,17 +43,19 @@ public class FdsfExportPaperService extends ExportPaperAbstractService {
         if (paperExp != null) {
             String paperfileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
                     + ExamFileType.PAPER.getName() + DOCX_SUFFIX;
-            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
-            if (OFFLINE.equals(examType)) {
-                WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
-                paperExp.setExamRemarkWord(
-                        DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(paperExp.getExamRemark())));
-            }
-
-            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT));
+//            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
+//            if (OFFLINE.equals(examType)) {
+//                WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
+//                paperExp.setExamRemarkWord(
+//                        DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(paperExp.getExamRemark())));
+//            }
+//
+//            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT));
 
             long docxImgTime = System.currentTimeMillis();
-            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, getPkgList(paperId));
+//            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, getPkgList(paperId));
+            File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
+            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,paperfileName, ExportTemplateType.PAPER_EXPORT);
             long docxImgEndTime = System.currentTimeMillis();
             log.debug("处理word文字+图片耗时:" + (docxImgEndTime - docxImgTime) + "ms");
             // 下载音频
@@ -74,10 +75,12 @@ public class FdsfExportPaperService extends ExportPaperAbstractService {
         if (paperExp != null) {
             String answerFileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
                     + ExamFileType.ANSWER.getName() + DOCX_SUFFIX;
-            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + answerFileName);
+//            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + answerFileName);
             long docxTime = System.currentTimeMillis();
-            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT));
-            DocxProcessUtil.processImage(zipFileName + File.separator + answerFileName, getPkgList(paperId));
+//            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT));
+//            DocxProcessUtil.processImage(zipFileName + File.separator + answerFileName, getPkgList(paperId));
+            File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
+            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,answerFileName, ExportTemplateType.ANWSER_EXPORT);
             long docxEndTime = System.currentTimeMillis();
             log.debug("处理word文字+图片耗时:" + (docxEndTime - docxTime) + "ms");
         }
@@ -86,7 +89,6 @@ public class FdsfExportPaperService extends ExportPaperAbstractService {
     @Override
     public void uploadFile(ExtractConfig extractConfig, String paperId, ExportStructure exportStructure,
             User accessUser, ExamPaper examPaper) throws Exception {
-        Long rootOrgId = accessUser.getRootOrgId();
         PaperExp paperExp = initPaperExp(paperId);
         if (paperExp != null) {
             String currNum = CommonUtils.getCurNum();
@@ -101,21 +103,17 @@ public class FdsfExportPaperService extends ExportPaperAbstractService {
             // 没有试卷结构导出设置
             if (exportStructure == null) {
                 // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT), ExamFileType.PAPER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, examPaper);
                 // 上传答案
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT), ExamFileType.ANSWER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.ANWSER_EXPORT, ExamFileType.ANSWER, examPaper);
             } else if (exportStructure != null && exportStructure.getExportType() == ExportType.NORMAL) {
                 List<QuestionTypeNum> questionTypeNums = exportStructure.getQuestionTypeNums();
                 // 检查试卷中客观题的数量是否大于试卷导出设置中的设置的数量
                 checkObjectiveDetailsNum(paperExp, questionTypeNums);
                 // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT), ExamFileType.PAPER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, examPaper);
                 // 上传答案
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT), ExamFileType.ANSWER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.ANWSER_EXPORT, ExamFileType.ANSWER, examPaper);
                 // 上传试卷结构 不能在上传试卷和答案之前
                 uploadPaperStructure(paperExp, extractConfig, accessUser, currNum, questionTypeNums, examPaper);
             } else if (exportStructure != null && exportStructure.getExportType() == ExportType.ONLINE) {

+ 21 - 23
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/FjsfExportPaperService.java

@@ -3,7 +3,6 @@ package cn.com.qmth.examcloud.core.questions.service.export;
 import java.io.File;
 import java.util.List;
 
-import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
 import org.springframework.stereotype.Service;
 
 import cn.com.qmth.examcloud.api.commons.security.bean.User;
@@ -13,12 +12,12 @@ import cn.com.qmth.examcloud.core.questions.base.CommonUtils;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExamFileType;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExportTemplateType;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExportType;
-import cn.com.qmth.examcloud.core.questions.base.word.DocxProcessUtil;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExamPaper;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExportStructure;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExtractConfig;
 import cn.com.qmth.examcloud.core.questions.dao.entity.QuestionTypeNum;
 import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperExp;
+import cn.com.qmth.examcloud.core.questions.service.util.ExportPaperUtil;
 
 /**
  * @author weiwenhai
@@ -41,17 +40,19 @@ public class FjsfExportPaperService extends ExportPaperAbstractService {
         if (paperExp != null) {
             String paperfileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
                     + ExamFileType.PAPER.getName() + DOCX_SUFFIX;
-            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
-            if (OFFLINE.equals(examType)) {
-                WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
-                paperExp.setExamRemarkWord(
-                        DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(paperExp.getExamRemark())));
-            }
-
-            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT));
+//            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
+//            if (OFFLINE.equals(examType)) {
+//                WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
+//                paperExp.setExamRemarkWord(
+//                        DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(paperExp.getExamRemark())));
+//            }
+//
+//            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT));
 
             long docxImgTime = System.currentTimeMillis();
-            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, getPkgList(paperId));
+//            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, getPkgList(paperId));
+            File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
+            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,paperfileName, ExportTemplateType.PAPER_EXPORT);
             long docxImgEndTime = System.currentTimeMillis();
             log.debug("处理word文字+图片耗时:" + (docxImgEndTime - docxImgTime) + "ms");
             // 下载音频
@@ -71,10 +72,12 @@ public class FjsfExportPaperService extends ExportPaperAbstractService {
         if (paperExp != null) {
             String answerFileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
                     + ExamFileType.ANSWER.getName() + DOCX_SUFFIX;
-            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + answerFileName);
+//            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + answerFileName);
             long docxTime = System.currentTimeMillis();
-            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT));
-            DocxProcessUtil.processImage(zipFileName + File.separator + answerFileName, getPkgList(paperId));
+//            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT));
+//            DocxProcessUtil.processImage(zipFileName + File.separator + answerFileName, getPkgList(paperId));
+            File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
+            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,answerFileName, ExportTemplateType.ANWSER_EXPORT);
             long docxEndTime = System.currentTimeMillis();
             log.debug("处理word文字+图片耗时:" + (docxEndTime - docxTime) + "ms");
         }
@@ -83,7 +86,6 @@ public class FjsfExportPaperService extends ExportPaperAbstractService {
     @Override
     public void uploadFile(ExtractConfig extractConfig, String paperId, ExportStructure exportStructure,
             User accessUser, ExamPaper examPaper) throws Exception {
-        Long rootOrgId = accessUser.getRootOrgId();
         PaperExp paperExp = initPaperExp(paperId);
         if (paperExp != null) {
             String currNum = CommonUtils.getCurNum();
@@ -98,21 +100,17 @@ public class FjsfExportPaperService extends ExportPaperAbstractService {
             // 没有试卷结构导出设置
             if (exportStructure == null) {
                 // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT), ExamFileType.PAPER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, examPaper);
                 // 上传答案
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT), ExamFileType.ANSWER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.ANWSER_EXPORT, ExamFileType.ANSWER, examPaper);
             } else if (exportStructure != null && exportStructure.getExportType() == ExportType.NORMAL) {
                 List<QuestionTypeNum> questionTypeNums = exportStructure.getQuestionTypeNums();
                 // 检查试卷中客观题的数量是否大于试卷导出设置中的设置的数量
                 checkObjectiveDetailsNum(paperExp, questionTypeNums);
                 // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT), ExamFileType.PAPER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, examPaper);
                 // 上传答案
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT), ExamFileType.ANSWER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.ANWSER_EXPORT, ExamFileType.ANSWER, examPaper);
                 // 上传试卷结构 不能在上传试卷和答案之前
                 uploadPaperStructure(paperExp, extractConfig, accessUser, currNum, questionTypeNums, examPaper);
             } else if (exportStructure != null && exportStructure.getExportType() == ExportType.ONLINE) {

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

@@ -10,12 +10,12 @@ import cn.com.qmth.examcloud.core.questions.base.CommonUtils;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExamFileType;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExportTemplateType;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExportType;
-import cn.com.qmth.examcloud.core.questions.base.word.DocxProcessUtil;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExamPaper;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExportStructure;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExtractConfig;
 import cn.com.qmth.examcloud.core.questions.dao.entity.QuestionTypeNum;
 import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperExp;
+import cn.com.qmth.examcloud.core.questions.service.util.ExportPaperUtil;
 
 @Service("hnsfExportPaperService")
 public class HnsfExportPaperService extends ExportPaperAbstractService {
@@ -26,11 +26,14 @@ public class HnsfExportPaperService extends ExportPaperAbstractService {
         if (paperExp != null) {
             String paperfileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
                     + ExamFileType.PAPER.getName() + DOCX_SUFFIX;
-            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
-
-            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT));
-
-            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, getPkgList(paperId));
+//            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
+//
+//            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT));
+//
+//            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, getPkgList(paperId));
+            
+            File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
+            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,paperfileName, ExportTemplateType.PAPER_EXPORT);
         }
     }
 
@@ -40,16 +43,17 @@ public class HnsfExportPaperService extends ExportPaperAbstractService {
         if (paperExp != null) {
             String answerFileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
                     + ExamFileType.ANSWER.getName() + DOCX_SUFFIX;
-            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + answerFileName);
-            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT));
-            DocxProcessUtil.processImage(zipFileName + File.separator + answerFileName, getPkgList(paperId));
+//            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + answerFileName);
+//            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT));
+//            DocxProcessUtil.processImage(zipFileName + File.separator + answerFileName, getPkgList(paperId));
+            File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
+            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,answerFileName, ExportTemplateType.ANWSER_EXPORT);
         }
     }
 
     @Override
     public void uploadFile(ExtractConfig extractConfig, String paperId, ExportStructure exportStructure,
             User accessUser, ExamPaper examPaper) throws Exception {
-        Long rootOrgId = accessUser.getRootOrgId();
         PaperExp paperExp = initPaperExp(paperId);
         if (paperExp != null) {
             String currNum = CommonUtils.getCurNum();
@@ -64,21 +68,17 @@ public class HnsfExportPaperService extends ExportPaperAbstractService {
             // 没有试卷结构导出设置
             if (exportStructure == null) {
                 // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT), ExamFileType.PAPER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, examPaper);
                 // 上传答案
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT), ExamFileType.ANSWER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.ANWSER_EXPORT, ExamFileType.ANSWER, examPaper);
             } else if (exportStructure != null && exportStructure.getExportType() == ExportType.NORMAL) {
                 List<QuestionTypeNum> questionTypeNums = exportStructure.getQuestionTypeNums();
                 // 检查试卷中客观题的数量是否大于试卷导出设置中的设置的数量
                 checkObjectiveDetailsNum(paperExp, questionTypeNums);
                 // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT), ExamFileType.PAPER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, examPaper);
                 // 上传答案
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT), ExamFileType.ANSWER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.ANWSER_EXPORT, ExamFileType.ANSWER, examPaper);
                 // 上传试卷结构 不能在上传试卷和答案之前
                 uploadPaperStructure(paperExp, extractConfig, accessUser, currNum, questionTypeNums, examPaper);
             } else if (exportStructure != null && exportStructure.getExportType() == ExportType.ONLINE) {

+ 15 - 16
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/HzkjExportPaperService.java

@@ -12,13 +12,13 @@ import cn.com.qmth.examcloud.core.questions.base.enums.ExamFileType;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExportTemplateType;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExportType;
 import cn.com.qmth.examcloud.core.questions.base.question.enums.QuesStructType;
-import cn.com.qmth.examcloud.core.questions.base.word.DocxProcessUtil;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExamPaper;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExportStructure;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExtractConfig;
 import cn.com.qmth.examcloud.core.questions.dao.entity.QuestionTypeNum;
 import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperDetailExp;
 import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperExp;
+import cn.com.qmth.examcloud.core.questions.service.util.ExportPaperUtil;
 
 /**
  * @author chenken
@@ -36,9 +36,11 @@ public class HzkjExportPaperService extends ExportPaperAbstractService {
         if (paperExp != null) {
             String paperfileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
                     + ExamFileType.PAPER.getName() + DOCX_SUFFIX;
-            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
-            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT));
-            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, getPkgList(paperId));
+//            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
+//            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT));
+//            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, getPkgList(paperId));
+            File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
+            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,paperfileName, ExportTemplateType.PAPER_EXPORT);
         }
     }
 
@@ -48,37 +50,34 @@ public class HzkjExportPaperService extends ExportPaperAbstractService {
         if (paperExp != null) {
             String answerFileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
                     + ExamFileType.ANSWER.getName() + DOCX_SUFFIX;
-            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + answerFileName);
-            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT));
-            DocxProcessUtil.processImage(zipFileName + File.separator + answerFileName, getPkgList(paperId));
+//            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + answerFileName);
+//            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT));
+//            DocxProcessUtil.processImage(zipFileName + File.separator + answerFileName, getPkgList(paperId));
+            File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
+            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,answerFileName, ExportTemplateType.ANWSER_EXPORT);
         }
     }
 
     @Override
     public void uploadFile(ExtractConfig extractConfig, String paperId, ExportStructure exportStructure,
             User accessUser, ExamPaper examPaper) throws Exception {
-        Long rootOrgId = accessUser.getRootOrgId();
         PaperExp paperExp = initPaperExp(paperId);
         if (paperExp != null) {
             String currNum = CommonUtils.getCurNum();
             // 没有试卷结构导出设置
             if (exportStructure == null) {
                 // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT), ExamFileType.PAPER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, examPaper);
                 // 上传答案
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT), ExamFileType.ANSWER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.ANWSER_EXPORT, ExamFileType.ANSWER, examPaper);
             } else if (exportStructure != null && exportStructure.getExportType() == ExportType.NORMAL) {
                 List<QuestionTypeNum> questionTypeNums = exportStructure.getQuestionTypeNums();
                 // 检查试卷中客观题的数量是否大于试卷导出设置中的设置的数量
                 checkObjectiveDetailsNum(paperExp, questionTypeNums);
                 // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT), ExamFileType.PAPER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, examPaper);
                 // 上传答案
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT), ExamFileType.ANSWER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.ANWSER_EXPORT, ExamFileType.ANSWER, examPaper);
                 // 上传试卷结构 不能在上传试卷和答案之前
                 uploadPaperStructure(paperExp, extractConfig, accessUser, currNum, questionTypeNums, examPaper);
             } else if (exportStructure != null && exportStructure.getExportType() == ExportType.ONLINE) {

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

@@ -1,37 +1,38 @@
 package cn.com.qmth.examcloud.core.questions.service.export;
 
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
 import cn.com.qmth.examcloud.commons.exception.StatusException;
 import cn.com.qmth.examcloud.core.questions.base.BeanCopierUtil;
 import cn.com.qmth.examcloud.core.questions.base.CommonUtils;
 import cn.com.qmth.examcloud.core.questions.base.Model;
 import cn.com.qmth.examcloud.core.questions.base.core.enums.CourseLevel;
 import cn.com.qmth.examcloud.core.questions.base.question.enums.QuesStructType;
-import cn.com.qmth.examcloud.core.questions.base.word.DocxProcessUtil;
-import cn.com.qmth.examcloud.core.questions.dao.*;
-import cn.com.qmth.examcloud.core.questions.dao.entity.*;
+import cn.com.qmth.examcloud.core.questions.dao.AudioTimeConfigRepo;
+import cn.com.qmth.examcloud.core.questions.dao.PaperDetailRepo;
+import cn.com.qmth.examcloud.core.questions.dao.PaperDetailUnitRepo;
+import cn.com.qmth.examcloud.core.questions.dao.PaperRepo;
+import cn.com.qmth.examcloud.core.questions.dao.QuesRepo;
+import cn.com.qmth.examcloud.core.questions.dao.entity.Course;
+import cn.com.qmth.examcloud.core.questions.dao.entity.Paper;
+import cn.com.qmth.examcloud.core.questions.dao.entity.PaperDetail;
+import cn.com.qmth.examcloud.core.questions.dao.entity.PaperDetailUnit;
+import cn.com.qmth.examcloud.core.questions.dao.entity.Question;
 import cn.com.qmth.examcloud.core.questions.service.ExamFileService;
-import cn.com.qmth.examcloud.core.questions.service.PaperDetailService;
 import cn.com.qmth.examcloud.core.questions.service.PaperService;
-import cn.com.qmth.examcloud.core.questions.service.QuestionAudioService;
 import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperDetailExp;
 import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperDetailUnitExp;
 import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperExp;
-import cn.com.qmth.examcloud.core.questions.service.config.SysProperty;
 import cn.com.qmth.examcloud.core.questions.service.impl.CourseService;
-import org.apache.commons.lang3.StringUtils;
-import org.docx4j.XmlUtils;
-import org.docx4j.jaxb.Context;
-import org.docx4j.wml.Body;
-import org.docx4j.wml.P;
-import org.docx4j.wml.R;
-import org.docx4j.wml.Text;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import javax.xml.bind.JAXBElement;
-import java.util.*;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 
 
 /**
@@ -57,11 +58,11 @@ public class InitPaperExpService {
     @Autowired
     ExamFileService examFileService;
 
-    @Autowired
-    private PaperDetailService paperDetailService;
-
-    @Autowired
-    private QuestionAudioService questionAudioService;
+//    @Autowired
+//    private PaperDetailService paperDetailService;
+//
+//    @Autowired
+//    private QuestionAudioService questionAudioService;
 
     @Autowired
     QuesRepo quesRepo;
@@ -72,8 +73,8 @@ public class InitPaperExpService {
     @Autowired
     CourseService courseService;
 
-    @Autowired
-    private SysProperty sysProperty;
+//    @Autowired
+//    private SysProperty sysProperty;
 
     public static final String FILL_BLANK_QUESTION_FLAG = "###";
 
@@ -370,32 +371,32 @@ public class InitPaperExpService {
      * @return
      * @throws Exception
      */
-    public String setOptionNum(String optionWordMl, String num) throws Exception {
-        String tmpStr = DocxProcessUtil.BODY_HEADER + optionWordMl + DocxProcessUtil.BODY_TAIL;
-        Body body = (Body) XmlUtils.unmarshalString(tmpStr, Context.jc, Body.class);
-        List<Object> pList = body.getContent();
-        int index = 0;
-        for (Object pObj : pList) {
-            if (index > 0) {
-                break;
-            }
-            P p = (P) pObj;
-            List<Object> pContent = p.getContent();
-            R run = new R();
-            Text text = new Text();
-            text.setValue(num + ". ");
-            run.getContent().add(text);
-            pContent.add(0, run);
-            index++;
-        }
-        StringBuffer pWordMl = new StringBuffer();
-        for (Object pObj : pList) {
-            if (pObj instanceof P) {
-                pWordMl.append(DocxProcessUtil.formatPWordMl(XmlUtils.marshaltoString(pObj)));
-            }
-        }
-        return pWordMl.toString();
-    }
+//    public String setOptionNum(String optionWordMl, String num) throws Exception {
+//        String tmpStr = DocxProcessUtil.BODY_HEADER + optionWordMl + DocxProcessUtil.BODY_TAIL;
+//        Body body = (Body) XmlUtils.unmarshalString(tmpStr, Context.jc, Body.class);
+//        List<Object> pList = body.getContent();
+//        int index = 0;
+//        for (Object pObj : pList) {
+//            if (index > 0) {
+//                break;
+//            }
+//            P p = (P) pObj;
+//            List<Object> pContent = p.getContent();
+//            R run = new R();
+//            Text text = new Text();
+//            text.setValue(num + ". ");
+//            run.getContent().add(text);
+//            pContent.add(0, run);
+//            index++;
+//        }
+//        StringBuffer pWordMl = new StringBuffer();
+//        for (Object pObj : pList) {
+//            if (pObj instanceof P) {
+//                pWordMl.append(DocxProcessUtil.formatPWordMl(XmlUtils.marshaltoString(pObj)));
+//            }
+//        }
+//        return pWordMl.toString();
+//    }
 
     /**
      * 将数字1,2,3,4转化成A,B,C,D
@@ -416,32 +417,32 @@ public class InitPaperExpService {
      * @return
      * @throws Exception
      */
-    public String setSubQuesNum(String quesBodyWordMl, int num) throws Exception {
-        String tmpStr = DocxProcessUtil.BODY_HEADER + quesBodyWordMl + DocxProcessUtil.BODY_TAIL;
-        Body body = (Body) XmlUtils.unmarshalString(tmpStr, Context.jc, Body.class);
-        List<Object> pList = body.getContent();
-        int index = 0;
-        for (Object pObj : pList) {
-            if (index > 0) {
-                break;
-            }
-            P p = (P) pObj;
-            List<Object> pContent = p.getContent();
-            R run = new R();
-            Text text = new Text();
-            text.setValue(num + ". ");
-            run.getContent().add(text);
-            pContent.add(0, run);
-            index++;
-        }
-        StringBuffer pWordMl = new StringBuffer();
-        for (Object pObj : pList) {
-            if (pObj instanceof P) {
-                pWordMl.append(DocxProcessUtil.formatPWordMl(XmlUtils.marshaltoString(pObj)));
-            }
-        }
-        return pWordMl.toString();
-    }
+//    public String setSubQuesNum(String quesBodyWordMl, int num) throws Exception {
+//        String tmpStr = DocxProcessUtil.BODY_HEADER + quesBodyWordMl + DocxProcessUtil.BODY_TAIL;
+//        Body body = (Body) XmlUtils.unmarshalString(tmpStr, Context.jc, Body.class);
+//        List<Object> pList = body.getContent();
+//        int index = 0;
+//        for (Object pObj : pList) {
+//            if (index > 0) {
+//                break;
+//            }
+//            P p = (P) pObj;
+//            List<Object> pContent = p.getContent();
+//            R run = new R();
+//            Text text = new Text();
+//            text.setValue(num + ". ");
+//            run.getContent().add(text);
+//            pContent.add(0, run);
+//            index++;
+//        }
+//        StringBuffer pWordMl = new StringBuffer();
+//        for (Object pObj : pList) {
+//            if (pObj instanceof P) {
+//                pWordMl.append(DocxProcessUtil.formatPWordMl(XmlUtils.marshaltoString(pObj)));
+//            }
+//        }
+//        return pWordMl.toString();
+//    }
 
     /**
      * 替换填空
@@ -452,71 +453,71 @@ public class InitPaperExpService {
      * @return
      * @throws Exception
      */
-    public String replaceQuesBlank(String wordMl, int num) throws Exception {
-        String tmpStr = DocxProcessUtil.BODY_HEADER + wordMl + DocxProcessUtil.BODY_TAIL;
-        Body body = (Body) XmlUtils.unmarshalString(tmpStr, Context.jc, Body.class);
-        List<Object> pList = body.getContent();
-        int index = 0;
-        int cur = 0;
-        Map<Integer, String> curMap = new HashMap<>();
-        for (Object pObj : pList) {
-            if (pObj.getClass().equals(P.class)) {
-                List<Object> pContent = ((P) pObj).getContent();
-                for (Object rObj : pContent) {
-                    if (rObj.getClass().equals(R.class)) {
-                        List<Object> rContent = ((R) rObj).getContent();
-                        for (Object tObj : rContent) {
-                            if (tObj instanceof JAXBElement)
-                                tObj = ((JAXBElement<?>) tObj).getValue();
-                            if (tObj.getClass().equals(Text.class)) {
-                                Text text = (Text) tObj;
-                                String str = text.getValue();
-                                //1
-                                if ("##".equals(str.trim())) {
-                                    str = "___";
-                                    text.setValue(str);
-                                }
-                                //2
-                                str = str.replaceAll("###", "______");
-                                text.setValue(str);
-                                //3
-                                Pattern pattern = Pattern.compile("##\\d{1,}##");
-                                Matcher m = pattern.matcher(str);
-                                while (m.find()) {
-                                    int curNum = num + index;
-                                    String a = m.group();
-                                    str = str.replaceAll(a, "___" + (curNum) + "___");
-                                    text.setValue(str);
-                                    index++;
-                                }
-                                //4
-                                /*if(str.startsWith("#") || str.equals("___")){
-                                    curMap.put(cur,str);
-                                    text.setValue("");
-                                }*/
-                                //5
-                                if (str.matches("^\\d{1,}$")) {
-                                    String preStr = curMap.get(cur - 1);
-                                    int curNum = num + index;
-                                    if (!StringUtils.isEmpty(preStr) && preStr.startsWith("#")) {
-                                        text.setValue("___" + (curNum) + "___");
-                                    }
-                                    index++;
-                                }
-                                cur++;
-                            }
-                        }
-                    }
-                }
-            }
-        }
-        StringBuffer pWordMl = new StringBuffer();
-        for (Object pObj : pList) {
-            if (pObj instanceof P) {
-                pWordMl.append(DocxProcessUtil.formatPWordMl(XmlUtils.marshaltoString(pObj)));
-            }
-        }
-        return pWordMl.toString();
-    }
+//    public String replaceQuesBlank(String wordMl, int num) throws Exception {
+//        String tmpStr = DocxProcessUtil.BODY_HEADER + wordMl + DocxProcessUtil.BODY_TAIL;
+//        Body body = (Body) XmlUtils.unmarshalString(tmpStr, Context.jc, Body.class);
+//        List<Object> pList = body.getContent();
+//        int index = 0;
+//        int cur = 0;
+//        Map<Integer, String> curMap = new HashMap<>();
+//        for (Object pObj : pList) {
+//            if (pObj.getClass().equals(P.class)) {
+//                List<Object> pContent = ((P) pObj).getContent();
+//                for (Object rObj : pContent) {
+//                    if (rObj.getClass().equals(R.class)) {
+//                        List<Object> rContent = ((R) rObj).getContent();
+//                        for (Object tObj : rContent) {
+//                            if (tObj instanceof JAXBElement)
+//                                tObj = ((JAXBElement<?>) tObj).getValue();
+//                            if (tObj.getClass().equals(Text.class)) {
+//                                Text text = (Text) tObj;
+//                                String str = text.getValue();
+//                                //1
+//                                if ("##".equals(str.trim())) {
+//                                    str = "___";
+//                                    text.setValue(str);
+//                                }
+//                                //2
+//                                str = str.replaceAll("###", "______");
+//                                text.setValue(str);
+//                                //3
+//                                Pattern pattern = Pattern.compile("##\\d{1,}##");
+//                                Matcher m = pattern.matcher(str);
+//                                while (m.find()) {
+//                                    int curNum = num + index;
+//                                    String a = m.group();
+//                                    str = str.replaceAll(a, "___" + (curNum) + "___");
+//                                    text.setValue(str);
+//                                    index++;
+//                                }
+//                                //4
+//                                /*if(str.startsWith("#") || str.equals("___")){
+//                                    curMap.put(cur,str);
+//                                    text.setValue("");
+//                                }*/
+//                                //5
+//                                if (str.matches("^\\d{1,}$")) {
+//                                    String preStr = curMap.get(cur - 1);
+//                                    int curNum = num + index;
+//                                    if (!StringUtils.isEmpty(preStr) && preStr.startsWith("#")) {
+//                                        text.setValue("___" + (curNum) + "___");
+//                                    }
+//                                    index++;
+//                                }
+//                                cur++;
+//                            }
+//                        }
+//                    }
+//                }
+//            }
+//        }
+//        StringBuffer pWordMl = new StringBuffer();
+//        for (Object pObj : pList) {
+//            if (pObj instanceof P) {
+//                pWordMl.append(DocxProcessUtil.formatPWordMl(XmlUtils.marshaltoString(pObj)));
+//            }
+//        }
+//        return pWordMl.toString();
+//    }
 
 }

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

@@ -3,7 +3,6 @@ package cn.com.qmth.examcloud.core.questions.service.export;
 import java.io.File;
 import java.util.List;
 
-import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
 import org.springframework.stereotype.Service;
 
 import cn.com.qmth.examcloud.api.commons.security.bean.User;
@@ -13,12 +12,12 @@ import cn.com.qmth.examcloud.core.questions.base.CommonUtils;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExamFileType;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExportTemplateType;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExportType;
-import cn.com.qmth.examcloud.core.questions.base.word.DocxProcessUtil;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExamPaper;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExportStructure;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExtractConfig;
 import cn.com.qmth.examcloud.core.questions.dao.entity.QuestionTypeNum;
 import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperExp;
+import cn.com.qmth.examcloud.core.questions.service.util.ExportPaperUtil;
 
 /**
  * @author weiwenhai
@@ -41,18 +40,20 @@ public class NkdxExportPaperService extends ExportPaperAbstractService {
         if (paperExp != null) {
             String paperfileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
                     + ExamFileType.PAPER.getName() + DOCX_SUFFIX;
-            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
-
-            if (OFFLINE.equals(examType)) {
-                WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
-                paperExp.setExamRemarkWord(
-                        DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(paperExp.getExamRemark())));
-            }
-
-            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT));
+//            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
+//
+//            if (OFFLINE.equals(examType)) {
+//                WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
+//                paperExp.setExamRemarkWord(
+//                        DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(paperExp.getExamRemark())));
+//            }
+//
+//            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT));
 
             long docxImgTime = System.currentTimeMillis();
-            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, getPkgList(paperId));
+//            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, getPkgList(paperId));
+            File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
+            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,paperfileName, ExportTemplateType.PAPER_EXPORT);
             long docxImgEndTime = System.currentTimeMillis();
             log.debug("处理word文字+图片耗时:" + (docxImgEndTime - docxImgTime) + "ms");
             // 下载音频
@@ -72,10 +73,12 @@ public class NkdxExportPaperService extends ExportPaperAbstractService {
         if (paperExp != null) {
             String answerFileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
                     + ExamFileType.ANSWER.getName() + DOCX_SUFFIX;
-            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + answerFileName);
+//            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + answerFileName);
             long docxTime = System.currentTimeMillis();
-            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT));
-            DocxProcessUtil.processImage(zipFileName + File.separator + answerFileName, getPkgList(paperId));
+//            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT));
+//            DocxProcessUtil.processImage(zipFileName + File.separator + answerFileName, getPkgList(paperId));
+            File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
+            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,answerFileName, ExportTemplateType.ANWSER_EXPORT);
             long docxEndTime = System.currentTimeMillis();
             log.debug("处理word文字+图片耗时:" + (docxEndTime - docxTime) + "ms");
         }
@@ -84,7 +87,6 @@ public class NkdxExportPaperService extends ExportPaperAbstractService {
     @Override
     public void uploadFile(ExtractConfig extractConfig, String paperId, ExportStructure exportStructure,
             User accessUser, ExamPaper examPaper) throws Exception {
-        Long rootOrgId = accessUser.getRootOrgId();
         PaperExp paperExp = initPaperExp(paperId);
         if (paperExp != null) {
             String currNum = CommonUtils.getCurNum();
@@ -99,21 +101,17 @@ public class NkdxExportPaperService extends ExportPaperAbstractService {
             // 没有试卷结构导出设置
             if (exportStructure == null) {
                 // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT), ExamFileType.PAPER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, examPaper);
                 // 上传答案
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT), ExamFileType.ANSWER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.ANWSER_EXPORT, ExamFileType.ANSWER, examPaper);
             } else if (exportStructure != null && exportStructure.getExportType() == ExportType.NORMAL) {
                 List<QuestionTypeNum> questionTypeNums = exportStructure.getQuestionTypeNums();
                 // 检查试卷中客观题的数量是否大于试卷导出设置中的设置的数量
                 checkObjectiveDetailsNum(paperExp, questionTypeNums);
                 // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT), ExamFileType.PAPER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, examPaper);
                 // 上传答案
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT), ExamFileType.ANSWER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.ANWSER_EXPORT, ExamFileType.ANSWER, examPaper);
                 // 上传试卷结构 不能在上传试卷和答案之前
                 uploadPaperStructure(paperExp, extractConfig, accessUser, currNum, questionTypeNums, examPaper);
             } else if (exportStructure != null && exportStructure.getExportType() == ExportType.ONLINE) {

+ 15 - 16
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/RjgcExportPaperService.java

@@ -10,12 +10,12 @@ import cn.com.qmth.examcloud.core.questions.base.CommonUtils;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExamFileType;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExportTemplateType;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExportType;
-import cn.com.qmth.examcloud.core.questions.base.word.DocxProcessUtil;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExamPaper;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExportStructure;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExtractConfig;
 import cn.com.qmth.examcloud.core.questions.dao.entity.QuestionTypeNum;
 import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperExp;
+import cn.com.qmth.examcloud.core.questions.service.util.ExportPaperUtil;
 
 /**
  * @author weiwenhai
@@ -32,9 +32,11 @@ public class RjgcExportPaperService extends ExportPaperAbstractService {
         if (paperExp != null) {
             String paperfileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
                     + ExamFileType.PAPER.getName() + DOCX_SUFFIX;
-            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
-            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT));
-            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, getPkgList(paperId));
+//            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
+//            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT));
+//            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, getPkgList(paperId));
+            File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
+            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,paperfileName, ExportTemplateType.PAPER_EXPORT);
         }
     }
 
@@ -44,16 +46,17 @@ public class RjgcExportPaperService extends ExportPaperAbstractService {
         if (paperExp != null) {
             String answerFileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
                     + ExamFileType.ANSWER.getName() + DOCX_SUFFIX;
-            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + answerFileName);
-            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT));
-            DocxProcessUtil.processImage(zipFileName + File.separator + answerFileName, getPkgList(paperId));
+//            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + answerFileName);
+//            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT));
+//            DocxProcessUtil.processImage(zipFileName + File.separator + answerFileName, getPkgList(paperId));
+            File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
+            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,answerFileName, ExportTemplateType.ANWSER_EXPORT);
         }
     }
 
     @Override
     public void uploadFile(ExtractConfig extractConfig, String paperId, ExportStructure exportStructure,
             User accessUser, ExamPaper examPaper) throws Exception {
-        Long rootOrgId = accessUser.getRootOrgId();
         PaperExp paperExp = initPaperExp(paperId);
         if (paperExp != null) {
             String currNum = CommonUtils.getCurNum();
@@ -68,21 +71,17 @@ public class RjgcExportPaperService extends ExportPaperAbstractService {
             // 没有试卷结构导出设置
             if (exportStructure == null) {
                 // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT), ExamFileType.PAPER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, examPaper);
                 // 上传答案
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT), ExamFileType.ANSWER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.ANWSER_EXPORT, ExamFileType.ANSWER, examPaper);
             } else if (exportStructure != null && exportStructure.getExportType() == ExportType.NORMAL) {
                 List<QuestionTypeNum> questionTypeNums = exportStructure.getQuestionTypeNums();
                 // 检查试卷中客观题的数量是否大于试卷导出设置中的设置的数量
                 checkObjectiveDetailsNum(paperExp, questionTypeNums);
                 // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT), ExamFileType.PAPER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, examPaper);
                 // 上传答案
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT), ExamFileType.ANSWER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.ANWSER_EXPORT, ExamFileType.ANSWER, examPaper);
                 // 上传试卷结构 不能在上传试卷和答案之前
                 uploadPaperStructure(paperExp, extractConfig, accessUser, currNum, questionTypeNums, examPaper);
             } else if (exportStructure != null && exportStructure.getExportType() == ExportType.ONLINE) {

+ 15 - 16
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/SddxExportPaperService.java

@@ -10,12 +10,12 @@ import cn.com.qmth.examcloud.core.questions.base.CommonUtils;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExamFileType;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExportTemplateType;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExportType;
-import cn.com.qmth.examcloud.core.questions.base.word.DocxProcessUtil;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExamPaper;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExportStructure;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExtractConfig;
 import cn.com.qmth.examcloud.core.questions.dao.entity.QuestionTypeNum;
 import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperExp;
+import cn.com.qmth.examcloud.core.questions.service.util.ExportPaperUtil;
 
 /**
  * @author chenken
@@ -36,9 +36,11 @@ public class SddxExportPaperService extends ExportPaperAbstractService {
             if (!firectory.exists()) {
                 firectory.mkdirs();
             }
-            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
-            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT));
-            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, getPkgList(paperId));
+//            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
+//            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT));
+//            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, getPkgList(paperId));
+            File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
+            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,paperfileName, ExportTemplateType.PAPER_EXPORT);
         }
     }
 
@@ -48,37 +50,34 @@ public class SddxExportPaperService extends ExportPaperAbstractService {
         if (paperExp != null) {
             String answerFileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
                     + ExamFileType.ANSWER.getName() + DOCX_SUFFIX;
-            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + answerFileName);
-            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT));
-            DocxProcessUtil.processImage(zipFileName + File.separator + answerFileName, getPkgList(paperId));
+//            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + answerFileName);
+//            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT));
+//            DocxProcessUtil.processImage(zipFileName + File.separator + answerFileName, getPkgList(paperId));
+            File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
+            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,answerFileName, ExportTemplateType.ANWSER_EXPORT);
         }
     }
 
     @Override
     public void uploadFile(ExtractConfig extractConfig, String paperId, ExportStructure exportStructure,
             User accessUser, ExamPaper examPaper) throws Exception {
-        Long rootOrgId = accessUser.getRootOrgId();
         PaperExp paperExp = initPaperExp(paperId);
         if (paperExp != null) {
             String currNum = CommonUtils.getCurNum();
             // 没有试卷结构导出设置
             if (exportStructure == null) {
                 // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT), ExamFileType.PAPER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, examPaper);
                 // 上传答案
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT), ExamFileType.ANSWER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum, ExportTemplateType.ANWSER_EXPORT, ExamFileType.ANSWER, examPaper);
             } else if (exportStructure != null && exportStructure.getExportType() == ExportType.NORMAL) {
                 List<QuestionTypeNum> questionTypeNums = exportStructure.getQuestionTypeNums();
                 // 检查试卷中客观题的数量是否大于试卷导出设置中的设置的数量
                 checkObjectiveDetailsNum(paperExp, questionTypeNums);
                 // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT), ExamFileType.PAPER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, examPaper);
                 // 上传答案
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT), ExamFileType.ANSWER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.ANWSER_EXPORT, ExamFileType.ANSWER, examPaper);
                 // 上传试卷结构 不能在上传试卷和答案之前
                 uploadPaperStructure(paperExp, extractConfig, accessUser, currNum, questionTypeNums, examPaper);
             } else if (exportStructure != null && exportStructure.getExportType() == ExportType.ONLINE) {

+ 26 - 24
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/SxsfExportPaperService.java

@@ -4,21 +4,19 @@ import java.io.File;
 import java.util.List;
 
 import org.apache.commons.lang3.StringUtils;
-import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
 import org.springframework.stereotype.Service;
 
 import cn.com.qmth.examcloud.api.commons.security.bean.User;
 import cn.com.qmth.examcloud.core.questions.base.CommonUtils;
-import cn.com.qmth.examcloud.core.questions.base.ImageUtils;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExamFileType;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExportTemplateType;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExportType;
-import cn.com.qmth.examcloud.core.questions.base.word.DocxProcessUtil;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExamPaper;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExportStructure;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExtractConfig;
 import cn.com.qmth.examcloud.core.questions.dao.entity.QuestionTypeNum;
 import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperExp;
+import cn.com.qmth.examcloud.core.questions.service.util.ExportPaperUtil;
 
 /**
  * @author chenken
@@ -35,27 +33,30 @@ public class SxsfExportPaperService extends ExportPaperAbstractService {
         if (paperExp != null) {
             String paperfileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
                     + ExamFileType.PAPER.getName() + DOCX_SUFFIX;
-            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
-            List<WordprocessingMLPackage> wordPackages = getPkgList(paperId);
+//            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
+//            List<WordprocessingMLPackage> wordPackages = getPkgList(paperId);
+            File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
             if (OFFLINE.equals(examType)) {
-                WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
+//                WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
                 if (StringUtils.isBlank(paperExp.getExamRemark())) {
                     paperExp.setExamRemark("<p></p>");
                 }
 
-                String examRemark = ImageUtils.reSizeImg(paperExp.getExamRemark());
-                paperExp.setExamRemarkWord(
-                        DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(examRemark)));
-                DocxProcessUtil.exportWordNew(paperExp, file,
-                        getTemplate(rootOrgId, ExportTemplateType.OUTLINE_PAPER_EXPORT));
-                if (DocxProcessUtil.hasImage(examRemark)) {
-                    wordPackages.add(wordMLPackage);
-                }
+//                String examRemark = ImageUtils.reSizeImg(paperExp.getExamRemark());
+//                paperExp.setExamRemarkWord(
+//                        DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(examRemark)));
+//                DocxProcessUtil.exportWordNew(paperExp, file,
+//                        ExportTemplateUtil.getTemplate(rootOrgId, ExportTemplateType.OUTLINE_PAPER_EXPORT));
+//                if (DocxProcessUtil.hasImage(examRemark)) {
+//                    wordPackages.add(wordMLPackage);
+//                }
+                ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,paperfileName, ExportTemplateType.OUTLINE_PAPER_EXPORT);
             } else {
-                DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT));
+//                DocxProcessUtil.exportWordNew(paperExp, file, ExportTemplateUtil.getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT));
+                ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,paperfileName, ExportTemplateType.PAPER_EXPORT);
             }
 
-            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, wordPackages);
+//            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, wordPackages);
             // 下载音频
             super.downloadAudio(paperExp, zipFileName);
         }
@@ -67,16 +68,17 @@ public class SxsfExportPaperService extends ExportPaperAbstractService {
         if (paperExp != null) {
             String answerFileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
                     + ExamFileType.ANSWER.getName() + DOCX_SUFFIX;
-            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + answerFileName);
-            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT));
-            DocxProcessUtil.processImage(zipFileName + File.separator + answerFileName, getPkgList(paperId));
+//            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + answerFileName);
+            File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
+            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,answerFileName, ExportTemplateType.ANWSER_EXPORT);
+//            DocxProcessUtil.exportWordNew(paperExp, file, ExportTemplateUtil.getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT));
+//            DocxProcessUtil.processImage(zipFileName + File.separator + answerFileName, getPkgList(paperId));
         }
     }
 
     @Override
     public void uploadFile(ExtractConfig extractConfig, String paperId, ExportStructure exportStructure,
             User accessUser, ExamPaper examPaper) throws Exception {
-        Long rootOrgId = accessUser.getRootOrgId();
         PaperExp paperExp = initPaperExp(paperId);
         if (paperExp != null) {
             String currNum = CommonUtils.getCurNum();
@@ -92,20 +94,20 @@ public class SxsfExportPaperService extends ExportPaperAbstractService {
             if (exportStructure == null) {
                 // 上传试卷
                 uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT), ExamFileType.PAPER, examPaper);
+                        ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, examPaper);
                 // 上传答案
                 uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT), ExamFileType.ANSWER, examPaper);
+                        ExportTemplateType.ANWSER_EXPORT, ExamFileType.ANSWER, examPaper);
             } else if (exportStructure != null && exportStructure.getExportType() == ExportType.NORMAL) {
                 List<QuestionTypeNum> questionTypeNums = exportStructure.getQuestionTypeNums();
                 // 检查试卷中客观题的数量是否大于试卷导出设置中的设置的数量
                 checkObjectiveDetailsNum(paperExp, questionTypeNums);
                 // 上传试卷
                 uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT), ExamFileType.PAPER, examPaper);
+                        ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, examPaper);
                 // 上传答案
                 uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT), ExamFileType.ANSWER, examPaper);
+                        ExportTemplateType.ANWSER_EXPORT, ExamFileType.ANSWER, examPaper);
                 // 上传试卷结构 不能在上传试卷和答案之前
                 uploadPaperStructure(paperExp, extractConfig, accessUser, currNum, questionTypeNums, examPaper);
             } else if (exportStructure != null && exportStructure.getExportType() == ExportType.ONLINE) {

+ 124 - 127
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/SydxExportPaperService.java

@@ -6,12 +6,6 @@ import java.util.Collections;
 import java.util.List;
 
 import org.apache.commons.lang3.StringUtils;
-import org.docx4j.XmlUtils;
-import org.docx4j.jaxb.Context;
-import org.docx4j.wml.Body;
-import org.docx4j.wml.P;
-import org.docx4j.wml.R;
-import org.docx4j.wml.Text;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 
@@ -24,7 +18,6 @@ import cn.com.qmth.examcloud.core.questions.base.enums.ExportTemplateType;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExportType;
 import cn.com.qmth.examcloud.core.questions.base.exception.PaperException;
 import cn.com.qmth.examcloud.core.questions.base.question.enums.QuesStructType;
-import cn.com.qmth.examcloud.core.questions.base.word.DocxProcessUtil;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExamPaper;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExportStructure;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExtractConfig;
@@ -37,6 +30,8 @@ import cn.com.qmth.examcloud.core.questions.dao.entity.QuestionTypeNum;
 import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperDetailExp;
 import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperDetailUnitExp;
 import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperExp;
+import cn.com.qmth.examcloud.core.questions.service.util.ExportPaperUtil;
+
 
 /**
  * @author chenken
@@ -50,23 +45,28 @@ public class SydxExportPaperService extends ExportPaperAbstractService {
     @Override
     public void downloadPaper(Long rootOrgId, String paperId, String zipFileName, String examType) throws Exception {
         PaperExp paperExp = initExportSydxPaper(paperId);
+//        PaperExp paperExp = initPaperExp(paperId);
         if (paperExp != null) {
             String paperfileName = paperExp.getCourseNo() + "_" + ExamFileType.PAPER.getName() + DOCX_SUFFIX;
-            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
-            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT));
-            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, getPkgList(paperId));
+//            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
+//            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT));
+//            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, getPkgList(paperId));
+            File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
+            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,paperfileName, ExportTemplateType.PAPER_EXPORT);
         }
 
     }
 
     @Override
     public void downloadPaperAnswer(Long rootOrgId, String paperId, String zipFileName) throws Exception {
-        PaperExp paperExp = initExportSydxPaper(paperId);
+        PaperExp paperExp = initPaperExp(paperId);
         if (paperExp != null) {
-            String paperfileName = paperExp.getCourseNo() + "_" + ExamFileType.ANSWER.getName() + DOCX_SUFFIX;
-            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
-            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT));
-            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, getPkgList(paperId));
+            String answerFileName = paperExp.getCourseNo() + "_" + ExamFileType.ANSWER.getName() + DOCX_SUFFIX;
+//            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
+//            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT));
+//            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, getPkgList(paperId));
+            File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
+            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,answerFileName, ExportTemplateType.ANWSER_EXPORT);
         }
 
     }
@@ -74,29 +74,26 @@ public class SydxExportPaperService extends ExportPaperAbstractService {
     @Override
     public void uploadFile(ExtractConfig extractConfig, String paperId, ExportStructure exportStructure,
             User accessUser, ExamPaper examPaper) throws Exception {
-        Long rootOrgId = accessUser.getRootOrgId();
         PaperExp exportPaperExp = initExportSydxPaper(paperId);
         PaperExp exportPaperStructureExp = initExportSydxPaper(paperId);
+//        PaperExp exportPaperExp = initPaperExp(paperId);
+//        PaperExp exportPaperStructureExp = initPaperExp(paperId);
         if (exportPaperExp != null && exportPaperStructureExp != null) {
             String currNum = CommonUtils.getCurNum();
             // 没有试卷结构导出设置
             if (exportStructure == null) {
                 // 上传试卷
-                uploadPaperOrAnswerFile(exportPaperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT), ExamFileType.PAPER, examPaper);
+                uploadPaperOrAnswerFile(exportPaperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, examPaper);
                 // 上传答案
-                uploadPaperOrAnswerFile(exportPaperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT), ExamFileType.ANSWER, examPaper);
+                uploadPaperOrAnswerFile(exportPaperExp, extractConfig, accessUser, currNum,ExportTemplateType.ANWSER_EXPORT, ExamFileType.ANSWER, examPaper);
             } else if (exportStructure != null && exportStructure.getExportType() == ExportType.NORMAL) {
                 List<QuestionTypeNum> questionTypeNums = exportStructure.getQuestionTypeNums();
                 // 检查试卷中客观题的数量是否大于试卷导出设置中的设置的数量
                 checkObjectiveDetailsNum(exportPaperStructureExp, questionTypeNums);
                 // 上传试卷
-                uploadPaperOrAnswerFile(exportPaperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT), ExamFileType.PAPER, examPaper);
+                uploadPaperOrAnswerFile(exportPaperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, examPaper);
                 // 上传答案
-                uploadPaperOrAnswerFile(exportPaperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT), ExamFileType.ANSWER, examPaper);
+                uploadPaperOrAnswerFile(exportPaperExp, extractConfig, accessUser, currNum,ExportTemplateType.ANWSER_EXPORT, ExamFileType.ANSWER, examPaper);
                 // 上传试卷结构 不能在上传试卷和答案之前
                 uploadPaperStructure(exportPaperStructureExp, extractConfig, accessUser, currNum, questionTypeNums,
                         examPaper);
@@ -163,36 +160,36 @@ public class SydxExportPaperService extends ExportPaperAbstractService {
      * @return
      * @throws Exception
      */
-    private String getObjectAnswer(String answerWordMl, String answer) throws Exception {
-        String tmpStr = DocxProcessUtil.BODY_HEADER + answerWordMl + DocxProcessUtil.BODY_TAIL;
-        Body body = (Body) XmlUtils.unmarshalString(tmpStr, Context.jc, Body.class);
-        List<Object> pList = body.getContent();
-        int index = 0;
-        for (Object pObj : pList) {
-            if (index > 0) {
-                break;
-            }
-            P p = (P) pObj;
-
-            List<Object> pContent = p.getContent();
-            pContent.clear();
-
-            R run = new R();
-            Text text = new Text();
-            text.setValue("[答案]:" + answer);
-            run.getContent().add(text);
-            pContent.add(0, run);
-            index++;
-        }
-
-        StringBuffer pWordMl = new StringBuffer();
-        for (Object pObj : pList) {
-            if (pObj instanceof P) {
-                pWordMl.append(DocxProcessUtil.formatPWordMl(XmlUtils.marshaltoString(pObj)));
-            }
-        }
-        return pWordMl.toString();
-    }
+//    private String getObjectAnswer(String answerWordMl, String answer) throws Exception {
+//        String tmpStr = DocxProcessUtil.BODY_HEADER + answerWordMl + DocxProcessUtil.BODY_TAIL;
+//        Body body = (Body) XmlUtils.unmarshalString(tmpStr, Context.jc, Body.class);
+//        List<Object> pList = body.getContent();
+//        int index = 0;
+//        for (Object pObj : pList) {
+//            if (index > 0) {
+//                break;
+//            }
+//            P p = (P) pObj;
+//
+//            List<Object> pContent = p.getContent();
+//            pContent.clear();
+//
+//            R run = new R();
+//            Text text = new Text();
+//            text.setValue("[答案]:" + answer);
+//            run.getContent().add(text);
+//            pContent.add(0, run);
+//            index++;
+//        }
+//
+//        StringBuffer pWordMl = new StringBuffer();
+//        for (Object pObj : pList) {
+//            if (pObj instanceof P) {
+//                pWordMl.append(DocxProcessUtil.formatPWordMl(XmlUtils.marshaltoString(pObj)));
+//            }
+//        }
+//        return pWordMl.toString();
+//    }
 
     /**
      * 设置主观题答案
@@ -201,32 +198,32 @@ public class SydxExportPaperService extends ExportPaperAbstractService {
      * @return
      * @throws Exception
      */
-    private String getSubjectAnswer(String answerWordMl) throws Exception {
-        String tmpStr = DocxProcessUtil.BODY_HEADER + answerWordMl + DocxProcessUtil.BODY_TAIL;
-        Body body = (Body) XmlUtils.unmarshalString(tmpStr, Context.jc, Body.class);
-        List<Object> pList = body.getContent();
-        int index = 0;
-        for (Object pObj : pList) {
-            if (index > 0) {
-                break;
-            }
-            P p = (P) pObj;
-            List<Object> pContent = p.getContent();
-            R run = new R();
-            Text text = new Text();
-            text.setValue("[答案]:");
-            run.getContent().add(text);
-            pContent.add(0, run);
-            index++;
-        }
-        StringBuffer pWordMl = new StringBuffer();
-        for (Object pObj : pList) {
-            if (pObj instanceof P) {
-                pWordMl.append(DocxProcessUtil.formatPWordMl(XmlUtils.marshaltoString(pObj)));
-            }
-        }
-        return pWordMl.toString();
-    }
+//    private String getSubjectAnswer(String answerWordMl) throws Exception {
+//        String tmpStr = DocxProcessUtil.BODY_HEADER + answerWordMl + DocxProcessUtil.BODY_TAIL;
+//        Body body = (Body) XmlUtils.unmarshalString(tmpStr, Context.jc, Body.class);
+//        List<Object> pList = body.getContent();
+//        int index = 0;
+//        for (Object pObj : pList) {
+//            if (index > 0) {
+//                break;
+//            }
+//            P p = (P) pObj;
+//            List<Object> pContent = p.getContent();
+//            R run = new R();
+//            Text text = new Text();
+//            text.setValue("[答案]:");
+//            run.getContent().add(text);
+//            pContent.add(0, run);
+//            index++;
+//        }
+//        StringBuffer pWordMl = new StringBuffer();
+//        for (Object pObj : pList) {
+//            if (pObj instanceof P) {
+//                pWordMl.append(DocxProcessUtil.formatPWordMl(XmlUtils.marshaltoString(pObj)));
+//            }
+//        }
+//        return pWordMl.toString();
+//    }
 
     private void setAnswerWord(List<PaperDetailUnit> paperDetailUnits) throws Exception {
         for (PaperDetailUnit paperDetailUnit : paperDetailUnits) {
@@ -254,7 +251,7 @@ public class SydxExportPaperService extends ExportPaperAbstractService {
                     }
                 }
             } else {
-                question.setQuesAnswerWord(getSubjectAnswer(question.getQuesAnswerWord()));
+//                question.setQuesAnswerWord(getSubjectAnswer(question.getQuesAnswerWord()));
             }
         }
     }
@@ -265,22 +262,22 @@ public class SydxExportPaperService extends ExportPaperAbstractService {
             return;
         }
         if (StringUtils.isEmpty(optionOrder)) {
-            int j = 0;
-            String answer = "";
+//            int j = 0;
+//            String answer = "";
             for (QuesOption quesOption : quesOptions) {
                 if (quesOption.getIsCorrect() == 1) {
-                    answer += CommonUtils.getOptionNum(j);
+//                    answer += CommonUtils.getOptionNum(j);
                 }
-                j++;
+//                j++;
             }
-            question.setQuesAnswerWord(getObjectAnswer(question.getQuesAnswerWord(), answer));
+//            question.setQuesAnswerWord(getObjectAnswer(question.getQuesAnswerWord(), answer));
         } else {
             String[] order = optionOrder.split(",");
             for (int i = 0; i < order.length; i++) {
                 for (QuesOption quesOption : quesOptions) {
                     if (order[i].equals(quesOption.getNumber()) && quesOption.getIsCorrect() == 1) {
-                        question.setQuesAnswerWord(
-                                getObjectAnswer(question.getQuesAnswerWord(), CommonUtils.getOptionNum(i)));
+//                        question.setQuesAnswerWord(
+//                                getObjectAnswer(question.getQuesAnswerWord(), CommonUtils.getOptionNum(i)));
                     }
                 }
             }
@@ -303,7 +300,7 @@ public class SydxExportPaperService extends ExportPaperAbstractService {
             return;
         }
         int mainNum = 0;
-        int subNum = 0;
+//        int subNum = 0;
         Collections.sort(paperExp.getPaperDetails());
         for (PaperDetailExp paperDetail : paperExp.getPaperDetails()) {
             // 大题序号
@@ -313,45 +310,45 @@ public class SydxExportPaperService extends ExportPaperAbstractService {
                 continue;
             }
             // 小题序号
-            for (PaperDetailUnitExp paperDetailUnit : paperDetail.getPaperDetailUnits()) {
-                List<QuesOption> optionList = paperDetailUnit.getQuestion().getQuesOptions();
-                if (optionList != null && optionList.size() > 0) {
-                    int index = 0;
-                    for (QuesOption quesOption : optionList) {
-                        quesOption.setOptionBodyWord(initPaperExpService.setOptionNum(quesOption.getOptionBodyWord(),
-                                initPaperExpService.getOptionNum(index)));
-                        index++;
-                    }
-                }
-                List<Question> subQuesList = paperDetailUnit.getQuestion().getSubQuestions();
-                Question question = paperDetailUnit.getQuestion();
+//            for (PaperDetailUnitExp paperDetailUnit : paperDetail.getPaperDetailUnits()) {
+//                List<QuesOption> optionList = paperDetailUnit.getQuestion().getQuesOptions();
+//                if (optionList != null && optionList.size() > 0) {
+//                    int index = 0;
+//                    for (QuesOption quesOption : optionList) {
+//                        quesOption.setOptionBodyWord(initPaperExpService.setOptionNum(quesOption.getOptionBodyWord(),
+//                                initPaperExpService.getOptionNum(index)));
+//                        index++;
+//                    }
+//                }
+//                List<Question> subQuesList = paperDetailUnit.getQuestion().getSubQuestions();
+//                Question question = paperDetailUnit.getQuestion();
                 // 套题序号
-                if (subQuesList != null && subQuesList.size() > 0) {
-                    question.setQuesBodyWord(
-                            initPaperExpService.replaceQuesBlank(question.getQuesBodyWord(), subNum + 1));
-                    for (Question subQues : subQuesList) {
-                        int curSubNum = ++subNum;
-                        subQues.setQuesBodyWord(
-                                initPaperExpService.setSubQuesNum(subQues.getQuesBodyWord(), curSubNum));
-                        subQues.setQuesBodyWord(
-                                initPaperExpService.replaceQuesBlank(subQues.getQuesBodyWord(), curSubNum));
-                        List<QuesOption> subOptionList = subQues.getQuesOptions();
-                        if (subOptionList != null && subOptionList.size() > 0) {
-                            int sub_index = 0;
-                            for (QuesOption quesOption : subOptionList) {
-                                quesOption.setOptionBodyWord(initPaperExpService.setOptionNum(
-                                        quesOption.getOptionBodyWord(), initPaperExpService.getOptionNum(sub_index)));
-                                sub_index++;
-                            }
-                        }
-                    }
-                } else {
-                    int curSubNum = ++subNum;
-                    question.setQuesBodyWord(initPaperExpService.setSubQuesNum(question.getQuesBodyWord(), curSubNum));
-                    question.setQuesBodyWord(
-                            initPaperExpService.replaceQuesBlank(question.getQuesBodyWord(), curSubNum));
-                }
-            }
+//                if (subQuesList != null && subQuesList.size() > 0) {
+//                    question.setQuesBodyWord(
+//                            initPaperExpService.replaceQuesBlank(question.getQuesBodyWord(), subNum + 1));
+//                    for (Question subQues : subQuesList) {
+//                        int curSubNum = ++subNum;
+//                        subQues.setQuesBodyWord(
+//                                initPaperExpService.setSubQuesNum(subQues.getQuesBodyWord(), curSubNum));
+//                        subQues.setQuesBodyWord(
+//                                initPaperExpService.replaceQuesBlank(subQues.getQuesBodyWord(), curSubNum));
+//                        List<QuesOption> subOptionList = subQues.getQuesOptions();
+//                        if (subOptionList != null && subOptionList.size() > 0) {
+//                            int sub_index = 0;
+//                            for (QuesOption quesOption : subOptionList) {
+//                                quesOption.setOptionBodyWord(initPaperExpService.setOptionNum(
+//                                        quesOption.getOptionBodyWord(), initPaperExpService.getOptionNum(sub_index)));
+//                                sub_index++;
+//                            }
+//                        }
+//                    }
+//                } else {
+//                    int curSubNum = ++subNum;
+//                    question.setQuesBodyWord(initPaperExpService.setSubQuesNum(question.getQuesBodyWord(), curSubNum));
+//                    question.setQuesBodyWord(
+//                            initPaperExpService.replaceQuesBlank(question.getQuesBodyWord(), curSubNum));
+//                }
+//            }
         }
     }
 

+ 33 - 36
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/TjdxExportPaperService.java

@@ -3,22 +3,19 @@ package cn.com.qmth.examcloud.core.questions.service.export;
 import java.io.File;
 import java.util.List;
 
-import org.apache.commons.lang3.StringUtils;
-import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
 import org.springframework.stereotype.Service;
 
 import cn.com.qmth.examcloud.api.commons.security.bean.User;
 import cn.com.qmth.examcloud.core.questions.base.CommonUtils;
-import cn.com.qmth.examcloud.core.questions.base.ImageUtils;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExamFileType;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExportTemplateType;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExportType;
-import cn.com.qmth.examcloud.core.questions.base.word.DocxProcessUtil;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExamPaper;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExportStructure;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExtractConfig;
 import cn.com.qmth.examcloud.core.questions.dao.entity.QuestionTypeNum;
 import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperExp;
+import cn.com.qmth.examcloud.core.questions.service.util.ExportPaperUtil;
 
 /**
  * @author chenken
@@ -35,30 +32,33 @@ public class TjdxExportPaperService extends ExportPaperAbstractService {
         if (paperExp != null) {
             String paperfileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
                     + ExamFileType.PAPER.getName() + DOCX_SUFFIX;
-            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
-
-            List<WordprocessingMLPackage> wordPackages = getPkgList(paperId);
+            File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
+//            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
+//
+//            List<WordprocessingMLPackage> wordPackages = getPkgList(paperId);
             if (OFFLINE.equals(examType)) {
-                // 生成考试说明的word片段
-                WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
-                if (StringUtils.isBlank(paperExp.getExamRemark())) {
-                    paperExp.setExamRemark("<p></p>");
-                }
-
-                String examRemark = ImageUtils.reSizeImg(paperExp.getExamRemark());
-                paperExp.setExamRemarkWord(
-                        DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(examRemark)));
-
-                DocxProcessUtil.exportWordNew(paperExp, file,
-                        getTemplate(rootOrgId, ExportTemplateType.OUTLINE_PAPER_EXPORT));
-                if (DocxProcessUtil.hasImage(examRemark)) {
-                    wordPackages.add(wordMLPackage);
-                }
+//                // 生成考试说明的word片段
+//                WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
+//                if (StringUtils.isBlank(paperExp.getExamRemark())) {
+//                    paperExp.setExamRemark("<p></p>");
+//                }
+//
+//                String examRemark = ImageUtils.reSizeImg(paperExp.getExamRemark());
+//                paperExp.setExamRemarkWord(
+//                        DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(examRemark)));
+//
+//                DocxProcessUtil.exportWordNew(paperExp, file,
+//                        getTemplate(rootOrgId, ExportTemplateType.OUTLINE_PAPER_EXPORT));
+//                if (DocxProcessUtil.hasImage(examRemark)) {
+//                    wordPackages.add(wordMLPackage);
+//                }
+                ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,paperfileName, ExportTemplateType.OUTLINE_PAPER_EXPORT);
             } else {
-                DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT));
+//                DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT));
+                ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,paperfileName, ExportTemplateType.PAPER_EXPORT);
             }
 
-            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, wordPackages);
+//            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, wordPackages);
             // 下载音频
             super.downloadAudio(paperExp, zipFileName);
         }
@@ -70,37 +70,34 @@ public class TjdxExportPaperService extends ExportPaperAbstractService {
         if (paperExp != null) {
             String answerFileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
                     + ExamFileType.ANSWER.getName() + DOCX_SUFFIX;
-            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + answerFileName);
-            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT));
-            DocxProcessUtil.processImage(zipFileName + File.separator + answerFileName, getPkgList(paperId));
+//            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + answerFileName);
+//            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT));
+//            DocxProcessUtil.processImage(zipFileName + File.separator + answerFileName, getPkgList(paperId));
+            File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
+            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,answerFileName, ExportTemplateType.ANWSER_EXPORT);
         }
     }
 
     @Override
     public void uploadFile(ExtractConfig extractConfig, String paperId, ExportStructure exportStructure,
             User accessUser, ExamPaper examPaper) throws Exception {
-        Long rootOrgId = accessUser.getRootOrgId();
         PaperExp paperExp = initPaperExp(paperId);
         if (paperExp != null) {
             String currNum = CommonUtils.getCurNum();
             // 没有试卷结构导出设置
             if (exportStructure == null) {
                 // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT), ExamFileType.PAPER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, examPaper);
                 // 上传答案
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT), ExamFileType.ANSWER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.ANWSER_EXPORT, ExamFileType.ANSWER, examPaper);
             } else if (exportStructure != null && exportStructure.getExportType() == ExportType.NORMAL) {
                 List<QuestionTypeNum> questionTypeNums = exportStructure.getQuestionTypeNums();
                 // 检查试卷中客观题的数量是否大于试卷导出设置中的设置的数量
                 checkObjectiveDetailsNum(paperExp, questionTypeNums);
                 // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT), ExamFileType.PAPER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, examPaper);
                 // 上传答案
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT), ExamFileType.ANSWER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.ANWSER_EXPORT, ExamFileType.ANSWER, examPaper);
                 // 上传试卷结构 不能在上传试卷和答案之前
                 uploadPaperStructure(paperExp, extractConfig, accessUser, currNum, questionTypeNums, examPaper);
             } else if (exportStructure != null && exportStructure.getExportType() == ExportType.ONLINE) {

+ 21 - 23
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/WheqxExportPaperService.java

@@ -9,7 +9,6 @@ package cn.com.qmth.examcloud.core.questions.service.export;
 import java.io.File;
 import java.util.List;
 
-import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
 import org.springframework.stereotype.Service;
 
 import cn.com.qmth.examcloud.api.commons.security.bean.User;
@@ -19,12 +18,12 @@ import cn.com.qmth.examcloud.core.questions.base.CommonUtils;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExamFileType;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExportTemplateType;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExportType;
-import cn.com.qmth.examcloud.core.questions.base.word.DocxProcessUtil;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExamPaper;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExportStructure;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExtractConfig;
 import cn.com.qmth.examcloud.core.questions.dao.entity.QuestionTypeNum;
 import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperExp;
+import cn.com.qmth.examcloud.core.questions.service.util.ExportPaperUtil;
 
 /**
  * 武汉市第二轻工业学校学校
@@ -47,17 +46,19 @@ public class WheqxExportPaperService extends ExportPaperAbstractService {
         if (paperExp != null) {
             String paperfileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
                     + ExamFileType.PAPER.getName() + DOCX_SUFFIX;
-            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
-            if (OFFLINE.equals(examType)) {
-                WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
-                paperExp.setExamRemarkWord(
-                        DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(paperExp.getExamRemark())));
-            }
-
-            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT));
+//            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
+//            if (OFFLINE.equals(examType)) {
+//                WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
+//                paperExp.setExamRemarkWord(
+//                        DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(paperExp.getExamRemark())));
+//            }
+//
+//            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT));
 
             long docxImgTime = System.currentTimeMillis();
-            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, getPkgList(paperId));
+//            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, getPkgList(paperId));
+            File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
+            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,paperfileName, ExportTemplateType.PAPER_EXPORT);
             long docxImgEndTime = System.currentTimeMillis();
             log.debug("处理word文字+图片耗时:" + (docxImgEndTime - docxImgTime) + "ms");
             // 下载音频
@@ -77,10 +78,12 @@ public class WheqxExportPaperService extends ExportPaperAbstractService {
         if (paperExp != null) {
             String answerFileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
                     + ExamFileType.ANSWER.getName() + DOCX_SUFFIX;
-            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + answerFileName);
+//            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + answerFileName);
             long docxTime = System.currentTimeMillis();
-            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT));
-            DocxProcessUtil.processImage(zipFileName + File.separator + answerFileName, getPkgList(paperId));
+//            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT));
+//            DocxProcessUtil.processImage(zipFileName + File.separator + answerFileName, getPkgList(paperId));
+            File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
+            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,answerFileName, ExportTemplateType.ANWSER_EXPORT);
             long docxEndTime = System.currentTimeMillis();
             log.debug("处理word文字+图片耗时:" + (docxEndTime - docxTime) + "ms");
         }
@@ -89,7 +92,6 @@ public class WheqxExportPaperService extends ExportPaperAbstractService {
     @Override
     public void uploadFile(ExtractConfig extractConfig, String paperId, ExportStructure exportStructure,
             User accessUser, ExamPaper examPaper) throws Exception {
-        Long rootOrgId = accessUser.getRootOrgId();
         PaperExp paperExp = initPaperExp(paperId);
         if (paperExp != null) {
             String currNum = CommonUtils.getCurNum();
@@ -104,21 +106,17 @@ public class WheqxExportPaperService extends ExportPaperAbstractService {
             // 没有试卷结构导出设置
             if (exportStructure == null) {
                 // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT), ExamFileType.PAPER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, examPaper);
                 // 上传答案
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT), ExamFileType.ANSWER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.ANWSER_EXPORT, ExamFileType.ANSWER, examPaper);
             } else if (exportStructure != null && exportStructure.getExportType() == ExportType.NORMAL) {
                 List<QuestionTypeNum> questionTypeNums = exportStructure.getQuestionTypeNums();
                 // 检查试卷中客观题的数量是否大于试卷导出设置中的设置的数量
                 checkObjectiveDetailsNum(paperExp, questionTypeNums);
                 // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT), ExamFileType.PAPER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, examPaper);
                 // 上传答案
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT), ExamFileType.ANSWER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.ANWSER_EXPORT, ExamFileType.ANSWER, examPaper);
                 // 上传试卷结构 不能在上传试卷和答案之前
                 uploadPaperStructure(paperExp, extractConfig, accessUser, currNum, questionTypeNums, examPaper);
             } else if (exportStructure != null && exportStructure.getExportType() == ExportType.ONLINE) {

+ 30 - 33
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/XnjdExportPaperService.java

@@ -3,22 +3,19 @@ package cn.com.qmth.examcloud.core.questions.service.export;
 import java.io.File;
 import java.util.List;
 
-import org.apache.commons.lang3.StringUtils;
-import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
 import org.springframework.stereotype.Service;
 
 import cn.com.qmth.examcloud.api.commons.security.bean.User;
 import cn.com.qmth.examcloud.core.questions.base.CommonUtils;
-import cn.com.qmth.examcloud.core.questions.base.ImageUtils;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExamFileType;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExportTemplateType;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExportType;
-import cn.com.qmth.examcloud.core.questions.base.word.DocxProcessUtil;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExamPaper;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExportStructure;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExtractConfig;
 import cn.com.qmth.examcloud.core.questions.dao.entity.QuestionTypeNum;
 import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperExp;
+import cn.com.qmth.examcloud.core.questions.service.util.ExportPaperUtil;
 
 /**
  * @author WEIWENHAI
@@ -35,27 +32,30 @@ public class XnjdExportPaperService extends ExportPaperAbstractService {
         if (paperExp != null) {
             String paperfileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
                     + ExamFileType.PAPER.getName() + DOCX_SUFFIX;
-            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
-            List<WordprocessingMLPackage> wordPackages = getPkgList(paperId);
+            File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
+//            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
+//            List<WordprocessingMLPackage> wordPackages = getPkgList(paperId);
             if (OFFLINE.equals(examType)) {
-                WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
-                if (StringUtils.isBlank(paperExp.getExamRemark())) {
-                    paperExp.setExamRemark("<p></p>");
-                }
-
-                String examRemark = ImageUtils.reSizeImg(paperExp.getExamRemark());
-                paperExp.setExamRemarkWord(
-                        DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(examRemark)));
-                DocxProcessUtil.exportWordNew(paperExp, file,
-                        getTemplate(rootOrgId, ExportTemplateType.OUTLINE_PAPER_EXPORT));
-                if (DocxProcessUtil.hasImage(examRemark)) {
-                    wordPackages.add(wordMLPackage);
-                }
+//                WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
+//                if (StringUtils.isBlank(paperExp.getExamRemark())) {
+//                    paperExp.setExamRemark("<p></p>");
+//                }
+//
+//                String examRemark = ImageUtils.reSizeImg(paperExp.getExamRemark());
+//                paperExp.setExamRemarkWord(
+//                        DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(examRemark)));
+//                DocxProcessUtil.exportWordNew(paperExp, file,
+//                        getTemplate(rootOrgId, ExportTemplateType.OUTLINE_PAPER_EXPORT));
+//                if (DocxProcessUtil.hasImage(examRemark)) {
+//                    wordPackages.add(wordMLPackage);
+//                }
+                ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,paperfileName, ExportTemplateType.OUTLINE_PAPER_EXPORT);
             } else {
-                DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT));
+//                DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT));
+                ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,paperfileName, ExportTemplateType.PAPER_EXPORT);
             }
 
-            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, wordPackages);
+//            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, wordPackages);
             // 下载音频
             super.downloadAudio(paperExp, zipFileName);
         }
@@ -67,16 +67,17 @@ public class XnjdExportPaperService extends ExportPaperAbstractService {
         if (paperExp != null) {
             String answerFileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
                     + ExamFileType.ANSWER.getName() + DOCX_SUFFIX;
-            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + answerFileName);
-            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT));
-            DocxProcessUtil.processImage(zipFileName + File.separator + answerFileName, getPkgList(paperId));
+//            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + answerFileName);
+//            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT));
+//            DocxProcessUtil.processImage(zipFileName + File.separator + answerFileName, getPkgList(paperId));
+            File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
+            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,answerFileName, ExportTemplateType.ANWSER_EXPORT);
         }
     }
 
     @Override
     public void uploadFile(ExtractConfig extractConfig, String paperId, ExportStructure exportStructure,
             User accessUser, ExamPaper examPaper) throws Exception {
-        Long rootOrgId = accessUser.getRootOrgId();
         PaperExp paperExp = initPaperExp(paperId);
         if (paperExp != null) {
             String currNum = CommonUtils.getCurNum();
@@ -91,21 +92,17 @@ public class XnjdExportPaperService extends ExportPaperAbstractService {
             // 没有试卷结构导出设置
             if (exportStructure == null) {
                 // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT), ExamFileType.PAPER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, examPaper);
                 // 上传答案
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT), ExamFileType.ANSWER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum, ExportTemplateType.ANWSER_EXPORT, ExamFileType.ANSWER, examPaper);
             } else if (exportStructure != null && exportStructure.getExportType() == ExportType.NORMAL) {
                 List<QuestionTypeNum> questionTypeNums = exportStructure.getQuestionTypeNums();
                 // 检查试卷中客观题的数量是否大于试卷导出设置中的设置的数量
                 checkObjectiveDetailsNum(paperExp, questionTypeNums);
                 // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT), ExamFileType.PAPER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, examPaper);
                 // 上传答案
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT), ExamFileType.ANSWER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.ANWSER_EXPORT, ExamFileType.ANSWER, examPaper);
                 // 上传试卷结构 不能在上传试卷和答案之前
                 uploadPaperStructure(paperExp, extractConfig, accessUser, currNum, questionTypeNums, examPaper);
             } else if (exportStructure != null && exportStructure.getExportType() == ExportType.ONLINE) {

+ 16 - 17
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/YkdxExportPaperService.java

@@ -10,12 +10,12 @@ import cn.com.qmth.examcloud.core.questions.base.CommonUtils;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExamFileType;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExportTemplateType;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExportType;
-import cn.com.qmth.examcloud.core.questions.base.word.DocxProcessUtil;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExamPaper;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExportStructure;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExtractConfig;
 import cn.com.qmth.examcloud.core.questions.dao.entity.QuestionTypeNum;
 import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperExp;
+import cn.com.qmth.examcloud.core.questions.service.util.ExportPaperUtil;
 
 @Service("ykdxExportPaperService")
 public class YkdxExportPaperService extends ExportPaperAbstractService {
@@ -26,10 +26,12 @@ public class YkdxExportPaperService extends ExportPaperAbstractService {
         if (paperExp != null) {
             String paperfileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
                     + ExamFileType.PAPER.getName() + DOCX_SUFFIX;
-            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
-
-            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT));
-            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, getPkgList(paperId));
+//            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
+//
+//            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT));
+//            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, getPkgList(paperId));
+            File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
+            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,paperfileName, ExportTemplateType.PAPER_EXPORT);
         }
     }
 
@@ -39,16 +41,17 @@ public class YkdxExportPaperService extends ExportPaperAbstractService {
         if (paperExp != null) {
             String answerFileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
                     + ExamFileType.ANSWER.getName() + DOCX_SUFFIX;
-            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + answerFileName);
-            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT));
-            DocxProcessUtil.processImage(zipFileName + File.separator + answerFileName, getPkgList(paperId));
+//            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + answerFileName);
+//            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT));
+//            DocxProcessUtil.processImage(zipFileName + File.separator + answerFileName, getPkgList(paperId));
+            File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
+            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,answerFileName, ExportTemplateType.ANWSER_EXPORT);
         }
     }
 
     @Override
     public void uploadFile(ExtractConfig extractConfig, String paperId, ExportStructure exportStructure,
             User accessUser, ExamPaper examPaper) throws Exception {
-        Long rootOrgId = accessUser.getRootOrgId();
         PaperExp paperExp = initPaperExp(paperId);
         if (paperExp != null) {
             String currNum = CommonUtils.getCurNum();
@@ -63,21 +66,17 @@ public class YkdxExportPaperService extends ExportPaperAbstractService {
             // 没有试卷结构导出设置
             if (exportStructure == null) {
                 // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT), ExamFileType.PAPER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, examPaper);
                 // 上传答案
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT), ExamFileType.ANSWER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.ANWSER_EXPORT, ExamFileType.ANSWER, examPaper);
             } else if (exportStructure != null && exportStructure.getExportType() == ExportType.NORMAL) {
                 List<QuestionTypeNum> questionTypeNums = exportStructure.getQuestionTypeNums();
                 // 检查试卷中客观题的数量是否大于试卷导出设置中的设置的数量
                 checkObjectiveDetailsNum(paperExp, questionTypeNums);
                 // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT), ExamFileType.PAPER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, examPaper);
                 // 上传答案
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT), ExamFileType.ANSWER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.ANWSER_EXPORT, ExamFileType.ANSWER, examPaper);
                 // 上传试卷结构 不能在上传试卷和答案之前
                 uploadPaperStructure(paperExp, extractConfig, accessUser, currNum, questionTypeNums, examPaper);
             } else if (exportStructure != null && exportStructure.getExportType() == ExportType.ONLINE) {

+ 21 - 23
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/ZgddbExportPaperService.java

@@ -3,7 +3,6 @@ package cn.com.qmth.examcloud.core.questions.service.export;
 import java.io.File;
 import java.util.List;
 
-import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
 import org.springframework.stereotype.Service;
 
 import cn.com.qmth.examcloud.api.commons.security.bean.User;
@@ -11,12 +10,12 @@ import cn.com.qmth.examcloud.core.questions.base.CommonUtils;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExamFileType;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExportTemplateType;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExportType;
-import cn.com.qmth.examcloud.core.questions.base.word.DocxProcessUtil;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExamPaper;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExportStructure;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExtractConfig;
 import cn.com.qmth.examcloud.core.questions.dao.entity.QuestionTypeNum;
 import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperExp;
+import cn.com.qmth.examcloud.core.questions.service.util.ExportPaperUtil;
 
 /**
  * @author weiwenhai
@@ -33,15 +32,17 @@ public class ZgddbExportPaperService extends ExportPaperAbstractService {
         if (paperExp != null) {
             String paperfileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
                     + ExamFileType.PAPER.getName() + DOCX_SUFFIX;
-            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
-            if (OFFLINE.equals(examType)) {
-                WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
-                paperExp.setExamRemarkWord(
-                        DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(paperExp.getExamRemark())));
-            }
-
-            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT));
-            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, getPkgList(paperId));
+//            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
+//            if (OFFLINE.equals(examType)) {
+//                WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
+//                paperExp.setExamRemarkWord(
+//                        DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(paperExp.getExamRemark())));
+//            }
+//
+//            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT));
+//            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, getPkgList(paperId));
+            File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
+            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,paperfileName, ExportTemplateType.PAPER_EXPORT);
             // 下载音频
             super.downloadAudio(paperExp, zipFileName);
         }
@@ -53,16 +54,17 @@ public class ZgddbExportPaperService extends ExportPaperAbstractService {
         if (paperExp != null) {
             String answerFileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
                     + ExamFileType.ANSWER.getName() + DOCX_SUFFIX;
-            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + answerFileName);
-            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT));
-            DocxProcessUtil.processImage(zipFileName + File.separator + answerFileName, getPkgList(paperId));
+//            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + answerFileName);
+//            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT));
+//            DocxProcessUtil.processImage(zipFileName + File.separator + answerFileName, getPkgList(paperId));
+            File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
+            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,answerFileName, ExportTemplateType.ANWSER_EXPORT);
         }
     }
 
     @Override
     public void uploadFile(ExtractConfig extractConfig, String paperId, ExportStructure exportStructure,
             User accessUser, ExamPaper examPaper) throws Exception {
-        Long rootOrgId = accessUser.getRootOrgId();
         PaperExp paperExp = initPaperExp(paperId);
         if (paperExp != null) {
             String currNum = CommonUtils.getCurNum();
@@ -77,21 +79,17 @@ public class ZgddbExportPaperService extends ExportPaperAbstractService {
             // 没有试卷结构导出设置
             if (exportStructure == null) {
                 // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT), ExamFileType.PAPER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, examPaper);
                 // 上传答案
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT), ExamFileType.ANSWER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.ANWSER_EXPORT, ExamFileType.ANSWER, examPaper);
             } else if (exportStructure != null && exportStructure.getExportType() == ExportType.NORMAL) {
                 List<QuestionTypeNum> questionTypeNums = exportStructure.getQuestionTypeNums();
                 // 检查试卷中客观题的数量是否大于试卷导出设置中的设置的数量
                 checkObjectiveDetailsNum(paperExp, questionTypeNums);
                 // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT), ExamFileType.PAPER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, examPaper);
                 // 上传答案
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT), ExamFileType.ANSWER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.ANWSER_EXPORT, ExamFileType.ANSWER, examPaper);
                 // 上传试卷结构 不能在上传试卷和答案之前
                 uploadPaperStructure(paperExp, extractConfig, accessUser, currNum, questionTypeNums, examPaper);
             } else if (exportStructure != null && exportStructure.getExportType() == ExportType.ONLINE) {

+ 21 - 23
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/ZgddwExportPaperService.java

@@ -3,7 +3,6 @@ package cn.com.qmth.examcloud.core.questions.service.export;
 import java.io.File;
 import java.util.List;
 
-import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
 import org.springframework.stereotype.Service;
 
 import cn.com.qmth.examcloud.api.commons.security.bean.User;
@@ -11,12 +10,12 @@ import cn.com.qmth.examcloud.core.questions.base.CommonUtils;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExamFileType;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExportTemplateType;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExportType;
-import cn.com.qmth.examcloud.core.questions.base.word.DocxProcessUtil;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExamPaper;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExportStructure;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExtractConfig;
 import cn.com.qmth.examcloud.core.questions.dao.entity.QuestionTypeNum;
 import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperExp;
+import cn.com.qmth.examcloud.core.questions.service.util.ExportPaperUtil;
 
 /**
  * @author weiwenhai
@@ -34,15 +33,17 @@ public class ZgddwExportPaperService extends ExportPaperAbstractService {
         if (paperExp != null) {
             String paperfileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
                     + ExamFileType.PAPER.getName() + DOCX_SUFFIX;
-            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
-            if (OFFLINE.equals(examType)) {
-                WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
-                paperExp.setExamRemarkWord(
-                        DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(paperExp.getExamRemark())));
-            }
-            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT));
-
-            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, getPkgList(paperId));
+//            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
+//            if (OFFLINE.equals(examType)) {
+//                WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
+//                paperExp.setExamRemarkWord(
+//                        DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(paperExp.getExamRemark())));
+//            }
+//            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT));
+//
+//            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, getPkgList(paperId));
+            File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
+            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,paperfileName, ExportTemplateType.PAPER_EXPORT);
             // 下载音频
             super.downloadAudio(paperExp, zipFileName);
         }
@@ -54,16 +55,17 @@ public class ZgddwExportPaperService extends ExportPaperAbstractService {
         if (paperExp != null) {
             String answerFileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
                     + ExamFileType.ANSWER.getName() + DOCX_SUFFIX;
-            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + answerFileName);
-            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT));
-            DocxProcessUtil.processImage(zipFileName + File.separator + answerFileName, getPkgList(paperId));
+//            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + answerFileName);
+//            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT));
+//            DocxProcessUtil.processImage(zipFileName + File.separator + answerFileName, getPkgList(paperId));
+            File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
+            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,answerFileName, ExportTemplateType.ANWSER_EXPORT);
         }
     }
 
     @Override
     public void uploadFile(ExtractConfig extractConfig, String paperId, ExportStructure exportStructure,
             User accessUser, ExamPaper examPaper) throws Exception {
-        Long rootOrgId = accessUser.getRootOrgId();
         PaperExp paperExp = initPaperExp(paperId);
         if (paperExp != null) {
             String currNum = CommonUtils.getCurNum();
@@ -78,21 +80,17 @@ public class ZgddwExportPaperService extends ExportPaperAbstractService {
             // 没有试卷结构导出设置
             if (exportStructure == null) {
                 // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT), ExamFileType.PAPER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, examPaper);
                 // 上传答案
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT), ExamFileType.ANSWER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.ANWSER_EXPORT, ExamFileType.ANSWER, examPaper);
             } else if (exportStructure != null && exportStructure.getExportType() == ExportType.NORMAL) {
                 List<QuestionTypeNum> questionTypeNums = exportStructure.getQuestionTypeNums();
                 // 检查试卷中客观题的数量是否大于试卷导出设置中的设置的数量
                 checkObjectiveDetailsNum(paperExp, questionTypeNums);
                 // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT), ExamFileType.PAPER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum, ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, examPaper);
                 // 上传答案
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT), ExamFileType.ANSWER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum, ExportTemplateType.ANWSER_EXPORT, ExamFileType.ANSWER, examPaper);
                 // 上传试卷结构 不能在上传试卷和答案之前
                 uploadPaperStructure(paperExp, extractConfig, accessUser, currNum, questionTypeNums, examPaper);
             } else if (exportStructure != null && exportStructure.getExportType() == ExportType.ONLINE) {

+ 15 - 16
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/xajdExportPaperService.java

@@ -10,12 +10,12 @@ import cn.com.qmth.examcloud.core.questions.base.CommonUtils;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExamFileType;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExportTemplateType;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExportType;
-import cn.com.qmth.examcloud.core.questions.base.word.DocxProcessUtil;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExamPaper;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExportStructure;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExtractConfig;
 import cn.com.qmth.examcloud.core.questions.dao.entity.QuestionTypeNum;
 import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperExp;
+import cn.com.qmth.examcloud.core.questions.service.util.ExportPaperUtil;
 
 /**
  * @author weiwenhai
@@ -32,9 +32,11 @@ public class xajdExportPaperService extends ExportPaperAbstractService {
         if (paperExp != null) {
             String paperfileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
                     + ExamFileType.PAPER.getName() + DOCX_SUFFIX;
-            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
-            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT));
-            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, getPkgList(paperId));
+//            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
+//            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT));
+//            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, getPkgList(paperId));
+            File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
+            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,paperfileName, ExportTemplateType.PAPER_EXPORT);
         }
     }
 
@@ -44,37 +46,34 @@ public class xajdExportPaperService extends ExportPaperAbstractService {
         if (paperExp != null) {
             String answerFileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
                     + ExamFileType.ANSWER.getName() + DOCX_SUFFIX;
-            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + answerFileName);
-            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT));
-            DocxProcessUtil.processImage(zipFileName + File.separator + answerFileName, getPkgList(paperId));
+//            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + answerFileName);
+//            DocxProcessUtil.exportWordNew(paperExp, file, getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT));
+//            DocxProcessUtil.processImage(zipFileName + File.separator + answerFileName, getPkgList(paperId));
+            File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
+            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,answerFileName, ExportTemplateType.ANWSER_EXPORT);
         }
     }
 
     @Override
     public void uploadFile(ExtractConfig extractConfig, String paperId, ExportStructure exportStructure,
             User accessUser, ExamPaper examPaper) throws Exception {
-        Long rootOrgId = accessUser.getRootOrgId();
         PaperExp paperExp = initPaperExp(paperId);
         if (paperExp != null) {
             String currNum = CommonUtils.getCurNum();
             // 没有试卷结构导出设置
             if (exportStructure == null) {
                 // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT), ExamFileType.PAPER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, examPaper);
                 // 上传答案
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT), ExamFileType.ANSWER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.ANWSER_EXPORT, ExamFileType.ANSWER, examPaper);
             } else if (exportStructure != null && exportStructure.getExportType() == ExportType.NORMAL) {
                 List<QuestionTypeNum> questionTypeNums = exportStructure.getQuestionTypeNums();
                 // 检查试卷中客观题的数量是否大于试卷导出设置中的设置的数量
                 checkObjectiveDetailsNum(paperExp, questionTypeNums);
                 // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT), ExamFileType.PAPER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, examPaper);
                 // 上传答案
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        getTemplate(rootOrgId, ExportTemplateType.ANWSER_EXPORT), ExamFileType.ANSWER, examPaper);
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.ANWSER_EXPORT, ExamFileType.ANSWER, examPaper);
                 // 上传试卷结构 不能在上传试卷和答案之前
                 uploadPaperStructure(paperExp, extractConfig, accessUser, currNum, questionTypeNums, examPaper);
             } else if (exportStructure != null && exportStructure.getExportType() == ExportType.ONLINE) {

+ 210 - 221
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/impl/ExportPaperServiceImpl.java

@@ -14,7 +14,6 @@ import java.util.Map;
 import java.util.TreeMap;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
-import java.util.stream.Collectors;
 
 import javax.servlet.http.HttpServletResponse;
 
@@ -26,8 +25,6 @@ import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.ss.usermodel.Sheet;
 import org.apache.poi.ss.usermodel.Workbook;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
-import org.docx4j.Docx4J;
-import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.mongodb.core.MongoTemplate;
 import org.springframework.data.mongodb.core.query.Criteria;
@@ -45,13 +42,8 @@ import cn.com.qmth.examcloud.core.questions.base.FileDisposeUtil;
 import cn.com.qmth.examcloud.core.questions.base.IdUtils;
 import cn.com.qmth.examcloud.core.questions.base.Model;
 import cn.com.qmth.examcloud.core.questions.base.SpringContextUtils;
-import cn.com.qmth.examcloud.core.questions.base.dto.ExportTempDataDto;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExamFileType;
-import cn.com.qmth.examcloud.core.questions.base.json.JSection;
-import cn.com.qmth.examcloud.core.questions.base.json.JsonExportUtil;
-import cn.com.qmth.examcloud.core.questions.base.json.SectionElement;
 import cn.com.qmth.examcloud.core.questions.base.question.enums.QuesStructType;
-import cn.com.qmth.examcloud.core.questions.base.word.DocxProcessUtil;
 import cn.com.qmth.examcloud.core.questions.dao.CoursePropertyRepo;
 import cn.com.qmth.examcloud.core.questions.dao.PaperDetailUnitRepo;
 import cn.com.qmth.examcloud.core.questions.dao.PaperRepo;
@@ -67,7 +59,6 @@ import cn.com.qmth.examcloud.core.questions.dao.entity.QuesOption;
 import cn.com.qmth.examcloud.core.questions.dao.entity.QuesProperty;
 import cn.com.qmth.examcloud.core.questions.dao.entity.Question;
 import cn.com.qmth.examcloud.core.questions.dao.entity.QuestionAudio;
-import cn.com.qmth.examcloud.core.questions.dao.entity.QuestionPkgPath;
 import cn.com.qmth.examcloud.core.questions.dao.entity.computerTestModel.Block;
 import cn.com.qmth.examcloud.core.questions.dao.entity.computerTestModel.ComputerTestOption;
 import cn.com.qmth.examcloud.core.questions.dao.entity.computerTestModel.ComputerTestPaper;
@@ -79,15 +70,13 @@ import cn.com.qmth.examcloud.core.questions.service.ExportPaperService;
 import cn.com.qmth.examcloud.core.questions.service.PaperDetailService;
 import cn.com.qmth.examcloud.core.questions.service.PaperService;
 import cn.com.qmth.examcloud.core.questions.service.PropertyService;
-import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperDetailExp;
-import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperDetailUnitExp;
 import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperExp;
 import cn.com.qmth.examcloud.core.questions.service.bean.dto.QuestionDistributeDto;
 import cn.com.qmth.examcloud.core.questions.service.config.SysProperty;
 import cn.com.qmth.examcloud.core.questions.service.converter.PrintExamPaperService;
 import cn.com.qmth.examcloud.core.questions.service.export.ExportPaperAbstractService;
+import cn.com.qmth.examcloud.core.questions.service.util.ExportPaperUtil;
 import main.java.com.UpYun;
-import sun.misc.BASE64Decoder;
 
 @Service("exportPaperService")
 public class ExportPaperServiceImpl implements ExportPaperService {
@@ -134,7 +123,6 @@ public class ExportPaperServiceImpl implements ExportPaperService {
 
     @Autowired
     private SysProperty sysProperty;
-
     @Override
     public void exportPaperFile(String paperId, String serviceName, String exportContentList,
             HttpServletResponse response, String loginName, String examType, String psw, Long rootOrgId) {
@@ -143,7 +131,7 @@ public class ExportPaperServiceImpl implements ExportPaperService {
         // 根据试卷id查询试卷
         Paper paper = Model.of(paperRepo.findById(paperId));
 
-        String zipFileName = loginName + System.currentTimeMillis() + "";
+        String zipFileName =IdUtils.uuid();
         long startTime;
         try {
             File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
@@ -194,17 +182,17 @@ public class ExportPaperServiceImpl implements ExportPaperService {
      * @param zipFileName
      * @throws Exception
      */
-    @SuppressWarnings("unused")
-    private void downExamRemark(Paper paper, String zipFileName) throws Exception {
-        // 1.考试说明html转成word
-        String title = "<p style=\"text-align:center\"><span style=\"font-size:26px\"><span style=\"font-family:宋体\">考&nbsp;试&nbsp;说&nbsp;明</span></span></p>";
-        WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
-        DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(title + paper.getExamRemark()));
-        // 2.导出考试说明word
-        File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paper.getCourse().getCode()
-                + TEMP_FILE_NAME);
-        Docx4J.save(wordMLPackage, file);
-    }
+//    @SuppressWarnings("unused")
+//    private void downExamRemark(Paper paper, String zipFileName) throws Exception {
+//        // 1.考试说明html转成word
+//        String title = "<p style=\"text-align:center\"><span style=\"font-size:26px\"><span style=\"font-family:宋体\">考&nbsp;试&nbsp;说&nbsp;明</span></span></p>";
+//        WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
+//        DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(title + paper.getExamRemark()));
+//        // 2.导出考试说明word
+//        File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paper.getCourse().getCode()
+//                + TEMP_FILE_NAME);
+//        Docx4J.save(wordMLPackage, file);
+//    }
 
     private void deteleFolder(String sourceFilePath, String zipFileName) {
         File ComputerTestPaperfoler = new File(sourceFilePath + File.separator + "json");
@@ -878,26 +866,26 @@ public class ExportPaperServiceImpl implements ExportPaperService {
 
     @Override
     public void downOriginalPaper(String paperId, String loginName, HttpServletResponse response) throws Exception {
-        String zipFileName = loginName + System.currentTimeMillis() + "";
-        try {
-            // 生成导出的试卷对象
-            PaperExp paperExp = paperService.getDownPaperExp(paperId);
-            File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
-            if (!directory.exists()) {
-                directory.mkdirs();
-            }
-            String paperfileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
-                    + ExamFileType.PAPER.getName() + DOCX_SUFFIX;
-            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
-            List<WordprocessingMLPackage> wordPackages = getPkgList(paperId);
-            DocxProcessUtil.exportWordNew(paperExp, file, ExportPaperAbstractService.ORIGINAL_PAPER);
-            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, wordPackages);
-            FileDisposeUtil.fileToZip(TEMP_FILE_EXP + File.separator + zipFileName, TEMP_FILE_EXP, zipFileName);
-            FileDisposeUtil.downloadFile(paperExp.getName() + "_" + paperExp.getCourse().getCode() + ".zip",
-                    TEMP_FILE_EXP + File.separator + zipFileName + ".zip", response);
-        } finally {
-            deteleFolder(TEMP_FILE_EXP, zipFileName);
-        }
+//        String zipFileName = loginName + System.currentTimeMillis() + "";
+//        try {
+//            // 生成导出的试卷对象
+//            PaperExp paperExp = paperService.getDownPaperExp(paperId);
+//            File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
+//            if (!directory.exists()) {
+//                directory.mkdirs();
+//            }
+//            String paperfileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
+//                    + ExamFileType.PAPER.getName() + DOCX_SUFFIX;
+//            File file = new File(TEMP_FILE_EXP + File.separator + zipFileName + File.separator + paperfileName);
+//            List<WordprocessingMLPackage> wordPackages = getPkgList(paperId);
+//            DocxProcessUtil.exportWordNew(paperExp, file, ExportPaperAbstractService.ORIGINAL_PAPER);
+//            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, wordPackages);
+//            FileDisposeUtil.fileToZip(TEMP_FILE_EXP + File.separator + zipFileName, TEMP_FILE_EXP, zipFileName);
+//            FileDisposeUtil.downloadFile(paperExp.getName() + "_" + paperExp.getCourse().getCode() + ".zip",
+//                    TEMP_FILE_EXP + File.separator + zipFileName + ".zip", response);
+//        } finally {
+//            deteleFolder(TEMP_FILE_EXP, zipFileName);
+//        }
     }
 
     /**
@@ -906,24 +894,24 @@ public class ExportPaperServiceImpl implements ExportPaperService {
      * @param id
      * @return
      */
-    protected List<WordprocessingMLPackage> getPkgList(String id) {
-        Paper paper = Model.of(paperRepo.findById(id));
-        List<WordprocessingMLPackage> wordMLPackages = paperDetailUnitRepo.findByPaperOrderByNumber(paper).stream()
-                .map(PaperDetailUnit::getQuestion).collect(Collectors.toList()).stream()
-                .map(question -> getPkgObj(question)).collect(Collectors.toList());
-        return wordMLPackages;
-    }
-
-    private WordprocessingMLPackage getPkgObj(Question question) {
-        String pkgPathId = question.getQuesPkgPathId();
-        QuestionPkgPath quesPkg = quesPkgPathRepo.findFirstById(pkgPathId);
-        if (quesPkg == null) {
-            byte[] bytes = new byte[0];
-            return DocxProcessUtil.getPkg(bytes);
-        }
-        byte[] pkgByte = quesPkg.getQuesPkg();
-        return DocxProcessUtil.getPkg(pkgByte);
-    }
+//    protected List<WordprocessingMLPackage> getPkgList(String id) {
+//        Paper paper = Model.of(paperRepo.findById(id));
+//        List<WordprocessingMLPackage> wordMLPackages = paperDetailUnitRepo.findByPaperOrderByNumber(paper).stream()
+//                .map(PaperDetailUnit::getQuestion).collect(Collectors.toList()).stream()
+//                .map(question -> getPkgObj(question)).collect(Collectors.toList());
+//        return wordMLPackages;
+//    }
+//
+//    private WordprocessingMLPackage getPkgObj(Question question) {
+//        String pkgPathId = question.getQuesPkgPathId();
+//        QuestionPkgPath quesPkg = quesPkgPathRepo.findFirstById(pkgPathId);
+//        if (quesPkg == null) {
+//            byte[] bytes = new byte[0];
+//            return DocxProcessUtil.getPkg(bytes);
+//        }
+//        byte[] pkgByte = quesPkg.getQuesPkg();
+//        return DocxProcessUtil.getPkg(pkgByte);
+//    }
 
     @Override
     public void downQuestionDistributeByPapers(String paperIds, HttpServletResponse response) throws IOException {
@@ -1045,182 +1033,183 @@ public class ExportPaperServiceImpl implements ExportPaperService {
     }
 
     @Override
-    public void downOriginalPaperPlus(String paperId, String loginName, HttpServletResponse response) throws Exception {
+    public void downOriginalPaperPlus(String paperId, Long rootOrgId, HttpServletResponse response) throws Exception {
         String zipFileName = IdUtils.uuid();
         File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
         if (!directory.exists()) {
             directory.mkdirs();
         }
         // doc固定源文件目录
-        File docxDir = new File(JsonExportUtil.getDocxBasePath());
-        // 将要生成的doc源文件目录
-        File docxTargetDir = new File(directory.getAbsolutePath() + "/docx/");
-        docxTargetDir.mkdir();
+//        File docxDir = new File(JsonExportUtil.getDocxBasePath());
+//        // 将要生成的doc源文件目录
+//        File docxTargetDir = new File(directory.getAbsolutePath() + "/docx/");
+//        docxTargetDir.mkdir();
         try {
             // 复制docx基础文件
-            FileUtils.copyDirectory(docxDir, docxTargetDir);
+//            FileUtils.copyDirectory(docxDir, docxTargetDir);
             // 生成导出的试卷对象
             PaperExp paperExp = paperService.getDownPaperExp(paperId);
-            // 处理并生成doc源文件
-            dispose(docxTargetDir, paperExp);
-            // 压缩docx源文件
-            String paperfileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
-                    + ExamFileType.PAPER.getName();
-            File zipfile = new File(docxTargetDir.getParentFile().getAbsolutePath() + File.separator + "data"
-                    + File.separator + paperfileName + ZIP_SUFFIX);
-            zipfile.getParentFile().mkdir();
-            File docfile = new File(docxTargetDir.getParentFile().getAbsolutePath() + File.separator + "data"
-                    + File.separator + File.separator + paperfileName + DOCX_SUFFIX);
-            FileDisposeUtil.createZip(docxTargetDir.getAbsolutePath(), zipfile.getAbsolutePath());
-            // 修改压缩包为doc文件
-            zipfile.renameTo(docfile);
+//            // 处理并生成doc源文件
+//            dispose(docxTargetDir, paperExp);
+//            // 压缩docx源文件
+//            String paperfileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
+//                    + ExamFileType.PAPER.getName();
+//            File zipfile = new File(docxTargetDir.getParentFile().getAbsolutePath() + File.separator + "data"
+//                    + File.separator + paperfileName + ZIP_SUFFIX);
+//            zipfile.getParentFile().mkdir();
+//            File docfile = new File(docxTargetDir.getParentFile().getAbsolutePath() + File.separator + "data"
+//                    + File.separator + File.separator + paperfileName + DOCX_SUFFIX);
+//            FileDisposeUtil.createZip(docxTargetDir.getAbsolutePath(), zipfile.getAbsolutePath());
+//            // 修改压缩包为doc文件
+//            zipfile.renameTo(docfile);
+            File docfile= ExportPaperUtil.createOriginPaperDocFile(paperExp, directory);
             // doc文件加入下载包中
             FileDisposeUtil.fileToZip(docfile.getParentFile().getAbsolutePath(),
-                    docxTargetDir.getParentFile().getAbsolutePath(), zipFileName);
+                    directory.getAbsolutePath(), zipFileName);
             // 下载文件
             FileDisposeUtil.downloadFile(paperExp.getName() + "_" + paperExp.getCourse().getCode() + ".zip",
-                    docxTargetDir.getParentFile().getAbsolutePath() + File.separator + zipFileName + ".zip", response);
+                    directory.getAbsolutePath() + File.separator + zipFileName + ".zip", response);
         } finally {
             FileUtils.deleteDirectory(directory);
         }
 
     }
 
-    private void dispose(File docxTargetDir, PaperExp paperExp) throws IOException {
-        ExportTempDataDto dto = new ExportTempDataDto();
-        if (paperExp.getPaperDetails() != null && paperExp.getPaperDetails().size() > 0) {
-            for (PaperDetailExp pde : paperExp.getPaperDetails()) {
-                dto.setMainNum(dto.getMainNum() + 1);
-                dto.setSubNum(0);
-                if (pde.getPaperDetailUnits() != null && pde.getPaperDetailUnits().size() > 0) {
-                    for (PaperDetailUnitExp pdue : pde.getPaperDetailUnits()) {
-                        Question qes = pdue.getQuestion();
-                        disposeQuestion(qes, dto);
-                    }
-                }
-            }
-        }
-        // content-type
-        writeContentType(docxTargetDir, dto);
-        // document
-        writeDocument(docxTargetDir, paperExp);
-        // document-rel
-        writeDocumentRel(docxTargetDir, dto);
-        // image file
-        writeImage(docxTargetDir, dto);
-    }
-
-    private void writeImage(File docxTargetDir, ExportTempDataDto dto) throws IOException {
-        for (SectionElement se : dto.getImages()) {
-            File file = new File(docxTargetDir.getAbsolutePath() + "/word/media/image" + se.getParams().getIndex() + "."
-                    + se.getParams().getType());
-            String base64 = se.getValue();
-            if (base64.contains("data:image")) {
-                base64 = base64.substring(base64.indexOf(",") + 1);
-            }
-            BASE64Decoder decoder = new BASE64Decoder();
-            byte[] bytes = decoder.decodeBuffer(base64);
-            FileUtils.writeByteArrayToFile(file, bytes);
-        }
-    }
-
-    private void writeDocumentRel(File docxTargetDir, ExportTempDataDto dto) throws IOException {
-        Map<String, Object> map = new HashMap<String, Object>();
-        map.put("images", dto.getImages());
-        String doc = JsonExportUtil.getDocumentRelDoc(map);
-        File file = new File(docxTargetDir.getAbsolutePath() + "/word/_rels/document.xml.rels");
-        FileUtils.writeStringToFile(file, doc, "utf-8");
-    }
-
-    private void writeContentType(File docxTargetDir, ExportTempDataDto dto) throws IOException {
-        Map<String, Object> map = new HashMap<String, Object>();
-        map.put("images", dto.getTypes());
-        String doc = JsonExportUtil.getContentTypesDoc(map);
-        File file = new File(docxTargetDir.getAbsolutePath() + "/[Content_Types].xml");
-        FileUtils.writeStringToFile(file, doc, "utf-8");
-    }
-
-    private void writeDocument(File docxTargetDir, PaperExp paperExp) throws IOException {
-        String doc = JsonExportUtil.getDocumentDoc(paperExp);
-        File file = new File(docxTargetDir.getAbsolutePath() + "/word/document.xml");
-        FileUtils.writeStringToFile(file, doc, "utf-8");
-    }
-
-    private void disposeQuestion(Question qes, ExportTempDataDto dto) {
-        if (qes != null) {
-            List<JSection> slist1 = JsonExportUtil.getSections(qes.getQuesBody());
-            if (slist1 != null && slist1.size() > 0) {
-                if (qes.getSubQuestions() == null || qes.getSubQuestions().size() == 0) {// 套题题干不加题号
-                    dto.setSubNum(dto.getSubNum() + 1);
-                    SectionElement se = new SectionElement();
-                    se.setType(JsonExportUtil.ELEMENT_TYPE_TEXT);
-                    se.setValue(dto.getSubNum() + ".");
-                    slist1.get(0).getElements().add(0, se);
-                }
-
-                htmlToDoc(slist1, dto);
-                qes.setQuesBodyWord(getQuestionDoc(slist1));
-            }
-
-            if (qes.getQuesOptions() != null && qes.getQuesOptions().size() > 0) {
-                int index = 0;
-                for (QuesOption qo : qes.getQuesOptions()) {
-                    List<JSection> slist2 = JsonExportUtil.getSections(qo.getOptionBody());
-                    if (slist2 != null && slist2.size() > 0) {
-                        SectionElement se = new SectionElement();
-                        se.setType(JsonExportUtil.ELEMENT_TYPE_TEXT);
-                        se.setValue(JsonExportUtil.QUESOPS.charAt(index) + ".");
-                        index++;
-                        slist2.get(0).getElements().add(0, se);
-                        htmlToDoc(slist2, dto);
-                        qo.setOptionBodyWord(getQuestionDoc(slist2));
-                    }
-
-                }
-            }
-            List<JSection> slist3 = JsonExportUtil.getSections(qes.getQuesAnswer());
-            if (slist3 != null && slist3.size() > 0) {
-                SectionElement se = new SectionElement();
-                se.setType(JsonExportUtil.ELEMENT_TYPE_TEXT);
-                se.setValue("[答案]:");
-                slist3.get(0).getElements().add(0, se);
-
-                htmlToDoc(slist3, dto);
-                qes.setQuesAnswerWord(getQuestionDoc(slist3));
-            }
-
-            if (qes.getSubQuestions() != null && qes.getSubQuestions().size() > 0) {
-                dto.setSubNum(0);
-                for (Question sunqes : qes.getSubQuestions()) {
-                    disposeQuestion(sunqes, dto);// 递归处理套题
-                }
-            }
-        }
-    }
-
-    private void htmlToDoc(List<JSection> slist, ExportTempDataDto dto) {
-        for (JSection js : slist) {
-            for (SectionElement se : js.getElements()) {
-                if (JsonExportUtil.ELEMENT_TYPE_IMG.equals(se.getType())) {
-                    dto.setIndex(dto.getIndex() + 1);
-                    se.getParams().setIndex(dto.getIndex());
-                    se.getParams().setRid(JsonExportUtil.ELEMENT_TYPE_RID + dto.getIndex());
-                    se.getParams().setType(getImageType(se.getValue()));
-                    dto.getTypes().add(se.getParams().getType());
-                    dto.getImages().add(se);
-                }
-            }
-        }
-    }
-
-    private String getImageType(String base64) {
-        return base64.substring(11, base64.indexOf(";"));
-    }
-
-    private String getQuestionDoc(List<JSection> sections) {
-        Map<String, Object> map = new HashMap<String, Object>();
-        map.put("sections", sections);
-        String doc = JsonExportUtil.getQuestionSectionDoc(map);
-        return doc;
-    }
+//    private void dispose(File docxTargetDir, PaperExp paperExp) throws IOException {
+//        ExportTempDataDto dto = new ExportTempDataDto();
+//        if (paperExp.getPaperDetails() != null && paperExp.getPaperDetails().size() > 0) {
+//            for (PaperDetailExp pde : paperExp.getPaperDetails()) {
+//                dto.setMainNum(dto.getMainNum() + 1);
+//                dto.setSubNum(0);
+//                if (pde.getPaperDetailUnits() != null && pde.getPaperDetailUnits().size() > 0) {
+//                    for (PaperDetailUnitExp pdue : pde.getPaperDetailUnits()) {
+//                        Question qes = pdue.getQuestion();
+//                        disposeQuestion(qes, dto);
+//                    }
+//                }
+//            }
+//        }
+//        // content-type
+//        writeContentType(docxTargetDir, dto);
+//        // document
+//        writeDocument(docxTargetDir, paperExp);
+//        // document-rel
+//        writeDocumentRel(docxTargetDir, dto);
+//        // image file
+//        writeImage(docxTargetDir, dto);
+//    }
+//
+//    private void writeImage(File docxTargetDir, ExportTempDataDto dto) throws IOException {
+//        for (SectionElement se : dto.getImages()) {
+//            File file = new File(docxTargetDir.getAbsolutePath() + "/word/media/image" + se.getParams().getIndex() + "."
+//                    + se.getParams().getType());
+//            String base64 = se.getValue();
+//            if (base64.contains("data:image")) {
+//                base64 = base64.substring(base64.indexOf(",") + 1);
+//            }
+//            BASE64Decoder decoder = new BASE64Decoder();
+//            byte[] bytes = decoder.decodeBuffer(base64);
+//            FileUtils.writeByteArrayToFile(file, bytes);
+//        }
+//    }
+//
+//    private void writeDocumentRel(File docxTargetDir, ExportTempDataDto dto) throws IOException {
+//        Map<String, Object> map = new HashMap<String, Object>();
+//        map.put("images", dto.getImages());
+//        String doc = JsonExportUtil.getDocumentRelDoc(map);
+//        File file = new File(docxTargetDir.getAbsolutePath() + "/word/_rels/document.xml.rels");
+//        FileUtils.writeStringToFile(file, doc, "utf-8");
+//    }
+//
+//    private void writeContentType(File docxTargetDir, ExportTempDataDto dto) throws IOException {
+//        Map<String, Object> map = new HashMap<String, Object>();
+//        map.put("images", dto.getTypes());
+//        String doc = JsonExportUtil.getContentTypesDoc(map);
+//        File file = new File(docxTargetDir.getAbsolutePath() + "/[Content_Types].xml");
+//        FileUtils.writeStringToFile(file, doc, "utf-8");
+//    }
+//
+//    private void writeDocument(File docxTargetDir, PaperExp paperExp) throws IOException {
+//        String doc = JsonExportUtil.getDocumentDoc(paperExp);
+//        File file = new File(docxTargetDir.getAbsolutePath() + "/word/document.xml");
+//        FileUtils.writeStringToFile(file, doc, "utf-8");
+//    }
+//
+//    private void disposeQuestion(Question qes, ExportTempDataDto dto) {
+//        if (qes != null) {
+//            List<JSection> slist1 = JsonExportUtil.getSections(qes.getQuesBody());
+//            if (slist1 != null && slist1.size() > 0) {
+//                if (qes.getSubQuestions() == null || qes.getSubQuestions().size() == 0) {// 套题题干不加题号
+//                    dto.setSubNum(dto.getSubNum() + 1);
+//                    SectionElement se = new SectionElement();
+//                    se.setType(JsonExportUtil.ELEMENT_TYPE_TEXT);
+//                    se.setValue(dto.getSubNum() + ".");
+//                    slist1.get(0).getElements().add(0, se);
+//                }
+//
+//                htmlToDoc(slist1, dto);
+//                qes.setQuesBodyWord(getQuestionDoc(slist1));
+//            }
+//
+//            if (qes.getQuesOptions() != null && qes.getQuesOptions().size() > 0) {
+//                int index = 0;
+//                for (QuesOption qo : qes.getQuesOptions()) {
+//                    List<JSection> slist2 = JsonExportUtil.getSections(qo.getOptionBody());
+//                    if (slist2 != null && slist2.size() > 0) {
+//                        SectionElement se = new SectionElement();
+//                        se.setType(JsonExportUtil.ELEMENT_TYPE_TEXT);
+//                        se.setValue(JsonExportUtil.QUESOPS.charAt(index) + ".");
+//                        index++;
+//                        slist2.get(0).getElements().add(0, se);
+//                        htmlToDoc(slist2, dto);
+//                        qo.setOptionBodyWord(getQuestionDoc(slist2));
+//                    }
+//
+//                }
+//            }
+//            List<JSection> slist3 = JsonExportUtil.getSections(qes.getQuesAnswer());
+//            if (slist3 != null && slist3.size() > 0) {
+//                SectionElement se = new SectionElement();
+//                se.setType(JsonExportUtil.ELEMENT_TYPE_TEXT);
+//                se.setValue("[答案]:");
+//                slist3.get(0).getElements().add(0, se);
+//
+//                htmlToDoc(slist3, dto);
+//                qes.setQuesAnswerWord(getQuestionDoc(slist3));
+//            }
+//
+//            if (qes.getSubQuestions() != null && qes.getSubQuestions().size() > 0) {
+//                dto.setSubNum(0);
+//                for (Question sunqes : qes.getSubQuestions()) {
+//                    disposeQuestion(sunqes, dto);// 递归处理套题
+//                }
+//            }
+//        }
+//    }
+//
+//    private void htmlToDoc(List<JSection> slist, ExportTempDataDto dto) {
+//        for (JSection js : slist) {
+//            for (SectionElement se : js.getElements()) {
+//                if (JsonExportUtil.ELEMENT_TYPE_IMG.equals(se.getType())) {
+//                    dto.setIndex(dto.getIndex() + 1);
+//                    se.getParams().setIndex(dto.getIndex());
+//                    se.getParams().setRid(JsonExportUtil.ELEMENT_TYPE_RID + dto.getIndex());
+//                    se.getParams().setType(getImageType(se.getValue()));
+//                    dto.getTypes().add(se.getParams().getType());
+//                    dto.getImages().add(se);
+//                }
+//            }
+//        }
+//    }
+//
+//    private String getImageType(String base64) {
+//        return base64.substring(11, base64.indexOf(";"));
+//    }
+//
+//    private String getQuestionDoc(List<JSection> sections) {
+//        Map<String, Object> map = new HashMap<String, Object>();
+//        map.put("sections", sections);
+//        String doc = JsonExportUtil.getQuestionSectionDoc(map);
+//        return doc;
+//    }
 }

+ 70 - 9
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/impl/ExportTemplateServiceImpl.java

@@ -34,6 +34,7 @@ import cn.com.qmth.examcloud.core.questions.dao.ExportTemplateRepo;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExportTemplateEntity;
 import cn.com.qmth.examcloud.core.questions.service.ExportTemplateService;
 import cn.com.qmth.examcloud.web.bootstrap.PropertyHolder;
+import cn.com.qmth.examcloud.web.config.SystemProperties;
 import cn.com.qmth.examcloud.web.upyun.UpyunPathEnvironmentInfo;
 import cn.com.qmth.examcloud.web.upyun.UpyunService;
 
@@ -42,12 +43,15 @@ public class ExportTemplateServiceImpl implements ExportTemplateService {
 
     protected ExamCloudLog log = ExamCloudLogFactory.getLog(this.getClass());
 
+    private static final String ZIP_SUFFIX = "zip";
+
     @Autowired
     private ExportTemplateRepo exportTemplateRepo;
 
     @Autowired
     private UpyunService upyunService;
-
+    @Autowired
+    private SystemProperties systemProperties;
     @Override
     public Page<ExportTemplateDto> getPage(Long rootOrgId, String fileName, String type, int curPage, int pageSize) {
         Specification<ExportTemplateEntity> specification = (root, query, cb) -> {
@@ -153,9 +157,18 @@ public class ExportTemplateServiceImpl implements ExportTemplateService {
         exportTemplateRepo.updateEnableById(rootOrgId, id, false);
     }
 
+    private String toSqlSearchPattern(String column) {
+        if (StringUtils.isBlank(column)) {
+            return "%";
+        } else {
+            column = column.trim().replaceAll("\\s", "%");
+            column = "%" + column + "%";
+            return column;
+        }
+    }
     @Override
     public String getExportTemplateName(ExportTemplateType type, Long rootOrgId) {
-        String temPath = PropertyHolder.getString("examcloud.web.sys.tempDataDir");
+        String temPath = systemProperties.getTempDataDir();
         List<ExportTemplateEntity> list = exportTemplateRepo.findByRootOrgIdAndTypeAndEnable(rootOrgId, type.getCode(),
                 true);
         if (list == null || list.size() == 0) {
@@ -190,15 +203,63 @@ public class ExportTemplateServiceImpl implements ExportTemplateService {
             throw new StatusException("60002", "获取模板到本地失败");
         }
     }
-
-    private String toSqlSearchPattern(String column) {
-        if (StringUtils.isBlank(column)) {
-            return "%";
+    @Override
+    public File getExportTemplateDirectory(ExportTemplateType type, Long rootOrgId) {
+        String temPath = systemProperties.getTempDataDir();
+        if(temPath==null) {
+            throw new StatusException("70000", "tempDataDir未设置");
+        }
+        List<ExportTemplateEntity> list = exportTemplateRepo.findByRootOrgIdAndTypeAndEnable(rootOrgId, type.getCode(),
+                true);
+        if (list == null || list.size() == 0) {
+            throw new StatusException("70001", "模板未设置或未启用");
+        }
+        if (list != null && list.size() > 1) {
+            throw new StatusException("70002", "存在多个启用的模板");
+        }
+        ExportTemplateEntity et = list.get(0);
+        if (!ZIP_SUFFIX.equals(et.getSuffix())) {
+            throw new StatusException("70003", "模板文件不是zip格式");
+        }
+        File dir = new File(temPath + "/" + rootOrgId + "/" + et.getFileKey() + "/");
+        if (dir.exists()) {
+            return dir;
         } else {
-            column = column.trim().replaceAll("\\s", "%");
-            column = "%" + column + "%";
-            return column;
+            String fileName = et.getFileKey() + "." + et.getSuffix();
+            String filePath = temPath + "/" + rootOrgId + "/" + fileName;
+            File f = new File(filePath);
+            if (!f.exists()) {
+                String upyunFileUrl = PropertyHolder.getString("$upyun.site.1.domain");
+                createExportTemplateDir(upyunFileUrl + et.getFilePath(), filePath, dir);
+            }
+            return dir;
         }
     }
 
+    private synchronized void createExportTemplateDir(String fileUrl, String localFilePath, File directory) {
+        File f = new File(localFilePath);
+        File dir = f.getParentFile();
+        try {
+            if (!dir.exists()) {
+                dir.mkdirs();
+            }
+            if (!directory.exists()) {
+                dir.mkdir();
+            }
+            f.createNewFile();
+        } catch (IOException e) {
+            throw new StatusException("80001", "创建模板文件失败");
+        }
+        if (!FileDisposeUtil.saveUrlAs(fileUrl, localFilePath)) {
+            throw new StatusException("80002", "获取模板到本地失败");
+        } else {
+            try {
+                FileDisposeUtil.unZipFiles(localFilePath, directory.getAbsolutePath());
+                f.delete();
+            } catch (IOException e) {
+                throw new StatusException("80003", "解压模板到本地失败");
+            }
+        }
+    }
+    
 }

+ 58 - 43
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/impl/ExtractConfigFileServiceImpl.java

@@ -1,44 +1,68 @@
 package cn.com.qmth.examcloud.core.questions.service.impl;
 
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
 import cn.com.qmth.examcloud.api.commons.security.bean.User;
 import cn.com.qmth.examcloud.commons.exception.StatusException;
-import cn.com.qmth.examcloud.core.questions.base.*;
+import cn.com.qmth.examcloud.core.questions.base.CommonUtils;
+import cn.com.qmth.examcloud.core.questions.base.FileDisposeUtil;
+import cn.com.qmth.examcloud.core.questions.base.IoUtils;
+import cn.com.qmth.examcloud.core.questions.base.SpringContextUtils;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExamFileType;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExportType;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExportWay;
 import cn.com.qmth.examcloud.core.questions.base.excel.ExcelWriter;
-import cn.com.qmth.examcloud.core.questions.base.word.DocxProcessUtil;
 import cn.com.qmth.examcloud.core.questions.dao.ExportServiceManageRepo;
-import cn.com.qmth.examcloud.core.questions.dao.ExtractConfigRepo;
-import cn.com.qmth.examcloud.core.questions.dao.PaperDetailUnitRepo;
-import cn.com.qmth.examcloud.core.questions.dao.PaperRepo;
-import cn.com.qmth.examcloud.core.questions.dao.entity.*;
-import cn.com.qmth.examcloud.core.questions.service.*;
-import cn.com.qmth.examcloud.core.questions.service.bean.dto.*;
+import cn.com.qmth.examcloud.core.questions.dao.entity.ExamFile;
+import cn.com.qmth.examcloud.core.questions.dao.entity.ExamPaper;
+import cn.com.qmth.examcloud.core.questions.dao.entity.ExportServiceManage;
+import cn.com.qmth.examcloud.core.questions.dao.entity.ExportStructure;
+import cn.com.qmth.examcloud.core.questions.dao.entity.ExtractConfig;
+import cn.com.qmth.examcloud.core.questions.dao.entity.Paper;
+import cn.com.qmth.examcloud.core.questions.dao.entity.PaperDetailUnit;
+import cn.com.qmth.examcloud.core.questions.dao.entity.QuesOption;
+import cn.com.qmth.examcloud.core.questions.dao.entity.Question;
+import cn.com.qmth.examcloud.core.questions.dao.entity.QuestionAudio;
+import cn.com.qmth.examcloud.core.questions.dao.entity.QuestionTypeNum;
+import cn.com.qmth.examcloud.core.questions.service.ExamFileService;
+import cn.com.qmth.examcloud.core.questions.service.ExportStructureService;
+import cn.com.qmth.examcloud.core.questions.service.ExtractConfigFileService;
+import cn.com.qmth.examcloud.core.questions.service.ExtractConfigService;
+import cn.com.qmth.examcloud.core.questions.service.QuestionAudioService;
+import cn.com.qmth.examcloud.core.questions.service.bean.dto.ExportPaperInfoModel;
+import cn.com.qmth.examcloud.core.questions.service.bean.dto.ObjectiveQuestionStructure;
+import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperDetailExp;
+import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperDetailUnitExp;
+import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperExp;
+import cn.com.qmth.examcloud.core.questions.service.bean.dto.SubjectiveQuestionStructure;
 import cn.com.qmth.examcloud.core.questions.service.config.SysProperty;
 import cn.com.qmth.examcloud.core.questions.service.converter.PrintExamPaperService;
 import cn.com.qmth.examcloud.core.questions.service.export.ExportPaperAbstractService;
 import cn.com.qmth.examcloud.core.questions.service.export.InitPaperExpService;
+import cn.com.qmth.examcloud.core.questions.service.util.ExportPaperUtil;
 import cn.com.qmth.examcloud.examwork.api.ExamCloudService;
 import cn.com.qmth.examcloud.examwork.api.bean.ExamCourseRelationBean;
 import cn.com.qmth.examcloud.examwork.api.request.GetExamCourseListReq;
 import cn.com.qmth.examcloud.examwork.api.response.GetExamCourseListResp;
 import main.java.com.UpYun;
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.docx4j.Docx4J;
-import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import javax.servlet.http.HttpServletResponse;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.*;
-import java.util.Map.Entry;
 
 /**
  * @author chenken
@@ -53,7 +77,7 @@ public class ExtractConfigFileServiceImpl implements ExtractConfigFileService {
 
     public static final String TEMP_FILE_EXP = "docxExport/";
 
-    public static final String TEMP_FILE_NAME = "_考试说明.docx";
+    public static final String TEMP_FILE_NAME = "_考试说明";
 
     @Autowired
     private ExportStructureService exportStructureService;
@@ -67,26 +91,15 @@ public class ExtractConfigFileServiceImpl implements ExtractConfigFileService {
     @Autowired
     private ExportServiceManageRepo exportServiceManageRepo;
 
-    @Autowired
-    private ExtractConfigRepo extractConfigRepo;
-
     @Autowired
     private QuestionAudioService questionAudioService;
 
-    @Autowired
-    private PaperRepo paperRepo;
-
-    @Autowired
-    private PaperDetailUnitRepo paperDetailUnitRepo;
-
     @Autowired
     private InitPaperExpService initPaperExpService;
 
     @Autowired
     private PrintExamPaperService printExamPaperService;
 
-    @Autowired
-    private ExportPaperService exportPaperService;
 
     @Autowired
     private ExamCloudService examCloudService;
@@ -315,14 +328,16 @@ public class ExtractConfigFileServiceImpl implements ExtractConfigFileService {
      * @throws Exception
      */
     public void downExamRemark(PaperExp paperExp, String zipFileName, ExamFile examFile) throws Exception {
-        //1.考试说明html转成word
-        String title = "<p style=\"text-align:center\"><span style=\"font-size:26px\"><span style=\"font-family:宋体\">考&nbsp;试&nbsp;说&nbsp;明</span></span></p>";
-        WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
-        String html = title + ImageUtils.reSizeImg(paperExp.getExamRemark());
-        DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(html));
-        //2.导出考试说明word
-        File file = new File(zipFileName + File.separator + paperExp.getName() + "_" + paperExp.getCourse().getName() + "_" + paperExp.getCourse().getCode() + "_" + examFile.getGroupCode() + TEMP_FILE_NAME);
-        Docx4J.save(wordMLPackage, file);
+//        //1.考试说明html转成word
+//        String title = "<p style=\"text-align:center\"><span style=\"font-size:26px\"><span style=\"font-family:宋体\">考&nbsp;试&nbsp;说&nbsp;明</span></span></p>";
+//        WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
+//        String html = title + ImageUtils.reSizeImg(paperExp.getExamRemark());
+//        DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(html));
+//        //2.导出考试说明word
+        File directory = new File(zipFileName + File.separator);
+        String fileName=paperExp.getName() + "_" + paperExp.getCourse().getName() + "_" + paperExp.getCourse().getCode() + "_" + examFile.getGroupCode() + TEMP_FILE_NAME;
+//        Docx4J.save(wordMLPackage, file);
+        ExportPaperUtil.createExamRemarkDocFile(directory, fileName, paperExp.getExamRemark());
     }
 
     /**

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

@@ -1,41 +1,38 @@
 package cn.com.qmth.examcloud.core.questions.service.impl;
 
-import cn.com.qmth.examcloud.api.commons.security.bean.User;
-import cn.com.qmth.examcloud.commons.exception.StatusException;
-import cn.com.qmth.examcloud.commons.logging.ExamCloudLog;
-import cn.com.qmth.examcloud.commons.logging.ExamCloudLogFactory;
-import cn.com.qmth.examcloud.commons.util.JsonUtil;
-import cn.com.qmth.examcloud.core.print.api.CoursePaperCloudService;
-import cn.com.qmth.examcloud.core.print.api.bean.SyncCoursePaperBean;
-import cn.com.qmth.examcloud.core.print.api.request.SyncCoursePaperReq;
-import cn.com.qmth.examcloud.core.print.api.response.SyncCoursePaperResp;
-import cn.com.qmth.examcloud.core.questions.base.*;
-import cn.com.qmth.examcloud.core.questions.base.enums.PaperStatus;
-import cn.com.qmth.examcloud.core.questions.base.enums.PaperType;
-import cn.com.qmth.examcloud.core.questions.base.exception.PaperException;
-import cn.com.qmth.examcloud.core.questions.base.question.enums.QuesStructType;
-import cn.com.qmth.examcloud.core.questions.base.word.DocxProcessUtil;
-import cn.com.qmth.examcloud.core.questions.dao.*;
-import cn.com.qmth.examcloud.core.questions.dao.entity.*;
-import cn.com.qmth.examcloud.core.questions.service.*;
-import cn.com.qmth.examcloud.core.questions.service.bean.dto.*;
-import cn.com.qmth.examcloud.core.questions.service.config.SysProperty;
-import cn.com.qmth.examcloud.core.questions.service.export.ExportPaperAbstractService;
-import com.google.gson.Gson;
-import main.java.com.UpYun;
+import static cn.com.qmth.examcloud.core.questions.service.cache.Constants.CACHE_KEY_PAPER;
+import static cn.com.qmth.examcloud.core.questions.service.cache.Constants.CACHE_KEY_QUESTION;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang3.StringUtils;
-import org.docx4j.XmlUtils;
-import org.docx4j.jaxb.Context;
-import org.docx4j.wml.Body;
-import org.docx4j.wml.P;
-import org.docx4j.wml.R;
-import org.docx4j.wml.Text;
 import org.nlpcn.commons.lang.util.StringUtil;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.domain.*;
+import org.springframework.data.domain.Example;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageImpl;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Sort;
 import org.springframework.data.domain.Sort.Direction;
 import org.springframework.data.domain.Sort.Order;
 import org.springframework.data.mongodb.core.MongoTemplate;
@@ -46,15 +43,59 @@ import org.springframework.stereotype.Service;
 import org.springframework.util.Assert;
 import org.springframework.web.multipart.MultipartFile;
 
-import java.io.*;
-import java.math.BigDecimal;
-import java.text.SimpleDateFormat;
-import java.util.*;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
+import com.google.gson.Gson;
 
-import static cn.com.qmth.examcloud.core.questions.service.cache.Constants.CACHE_KEY_PAPER;
-import static cn.com.qmth.examcloud.core.questions.service.cache.Constants.CACHE_KEY_QUESTION;
+import cn.com.qmth.examcloud.api.commons.security.bean.User;
+import cn.com.qmth.examcloud.commons.exception.StatusException;
+import cn.com.qmth.examcloud.commons.logging.ExamCloudLog;
+import cn.com.qmth.examcloud.commons.logging.ExamCloudLogFactory;
+import cn.com.qmth.examcloud.commons.util.JsonUtil;
+import cn.com.qmth.examcloud.core.print.api.CoursePaperCloudService;
+import cn.com.qmth.examcloud.core.print.api.bean.SyncCoursePaperBean;
+import cn.com.qmth.examcloud.core.print.api.request.SyncCoursePaperReq;
+import cn.com.qmth.examcloud.core.print.api.response.SyncCoursePaperResp;
+import cn.com.qmth.examcloud.core.questions.base.BeanCopierUtil;
+import cn.com.qmth.examcloud.core.questions.base.CommonUtils;
+import cn.com.qmth.examcloud.core.questions.base.IoUtils;
+import cn.com.qmth.examcloud.core.questions.base.Model;
+import cn.com.qmth.examcloud.core.questions.base.SpringContextUtils;
+import cn.com.qmth.examcloud.core.questions.base.enums.PaperStatus;
+import cn.com.qmth.examcloud.core.questions.base.enums.PaperType;
+import cn.com.qmth.examcloud.core.questions.base.exception.PaperException;
+import cn.com.qmth.examcloud.core.questions.base.question.enums.QuesStructType;
+import cn.com.qmth.examcloud.core.questions.dao.ExamPaperRepo;
+import cn.com.qmth.examcloud.core.questions.dao.ExportServiceManageRepo;
+import cn.com.qmth.examcloud.core.questions.dao.PaperDetailRepo;
+import cn.com.qmth.examcloud.core.questions.dao.PaperDetailUnitRepo;
+import cn.com.qmth.examcloud.core.questions.dao.PaperRepo;
+import cn.com.qmth.examcloud.core.questions.dao.QuesBakRepo;
+import cn.com.qmth.examcloud.core.questions.dao.QuesRepo;
+import cn.com.qmth.examcloud.core.questions.dao.entity.Course;
+import cn.com.qmth.examcloud.core.questions.dao.entity.ExamPaper;
+import cn.com.qmth.examcloud.core.questions.dao.entity.ExportServiceManage;
+import cn.com.qmth.examcloud.core.questions.dao.entity.Paper;
+import cn.com.qmth.examcloud.core.questions.dao.entity.PaperDetail;
+import cn.com.qmth.examcloud.core.questions.dao.entity.PaperDetailUnit;
+import cn.com.qmth.examcloud.core.questions.dao.entity.PaperSearchInfo;
+import cn.com.qmth.examcloud.core.questions.dao.entity.QuesOption;
+import cn.com.qmth.examcloud.core.questions.dao.entity.QuesProperty;
+import cn.com.qmth.examcloud.core.questions.dao.entity.Question;
+import cn.com.qmth.examcloud.core.questions.dao.entity.QuestionAudio;
+import cn.com.qmth.examcloud.core.questions.dao.entity.QuestionBak;
+import cn.com.qmth.examcloud.core.questions.service.ExtractConfigService;
+import cn.com.qmth.examcloud.core.questions.service.PaperDetailService;
+import cn.com.qmth.examcloud.core.questions.service.PaperDetailUnitService;
+import cn.com.qmth.examcloud.core.questions.service.PaperService;
+import cn.com.qmth.examcloud.core.questions.service.QuesService;
+import cn.com.qmth.examcloud.core.questions.service.bean.dto.ObjectiveQuestionStructure;
+import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperDetailExp;
+import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperDetailUnitExp;
+import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperExp;
+import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperQuestionStructureInfo;
+import cn.com.qmth.examcloud.core.questions.service.bean.dto.SubjectiveQuestionStructure;
+import cn.com.qmth.examcloud.core.questions.service.config.SysProperty;
+import cn.com.qmth.examcloud.core.questions.service.export.ExportPaperAbstractService;
+import main.java.com.UpYun;
 
 /**
  * @author chenken
@@ -1552,16 +1593,16 @@ public class PaperServiceImpl implements PaperService {
                     //设置选项
                     List<QuesOption> optionList = paperDetailUnit.getQuestion().getQuesOptions();
                     if (optionList != null && optionList.size() > 0) {
-                        int index = 0;
-                        for (QuesOption quesOption : optionList) {
-                            quesOption.setOptionBodyWord(setOptionNum(quesOption.getOptionBodyWord(), getOptionNum(index)));
-                            index++;
-                        }
+//                        int index = 0;
+//                        for (QuesOption quesOption : optionList) {
+//                            quesOption.setOptionBodyWord(setOptionNum(quesOption.getOptionBodyWord(), getOptionNum(index)));
+//                            index++;
+//                        }
                     }
                     if (question.getQuestionType() != QuesStructType.NESTED_ANSWER_QUESTION) {
                         //给小题设置序号
-                        question.setQuesBodyWord(setSubQuesNum(question.getQuesBodyWord(), minNum++));
-                        question.setQuesAnswerWord(setAnswerNum(question.getQuesAnswerWord()));
+//                        question.setQuesBodyWord(setSubQuesNum(question.getQuesBodyWord(), minNum++));
+//                        question.setQuesAnswerWord(setAnswerNum(question.getQuesAnswerWord()));
                         if (paperDetail.getFirstScore() == null) {
                             if (question.getScore() == null) {
                                 paperDetail.setFirstScore(0d);
@@ -1576,8 +1617,8 @@ public class PaperServiceImpl implements PaperService {
                             int index = 1;
                             for (Question subQues : subQuesList) {
                                 subQues.setDifficultyDegree(subQues.getDifficultyDegree() * 10);
-                                subQues.setQuesBodyWord(setSubQuesNum(subQues.getQuesBodyWord(), index++));
-                                subQues.setQuesAnswerWord(setAnswerNum(subQues.getQuesAnswerWord()));
+//                                subQues.setQuesBodyWord(setSubQuesNum(subQues.getQuesBodyWord(), index++));
+//                                subQues.setQuesAnswerWord(setAnswerNum(subQues.getQuesAnswerWord()));
                                 if (paperDetail.getFirstScore() == null) {
                                     if (subQues.getScore() == null) {
                                         paperDetail.setFirstScore(0d);
@@ -1589,7 +1630,7 @@ public class PaperServiceImpl implements PaperService {
                                 if (subOptionList != null && subOptionList.size() > 0) {
                                     int sub_index = 0;
                                     for (QuesOption quesOption : subOptionList) {
-                                        quesOption.setOptionBodyWord(setOptionNum(quesOption.getOptionBodyWord(), getOptionNum(sub_index)));
+//                                        quesOption.setOptionBodyWord(setOptionNum(quesOption.getOptionBodyWord(), getOptionNum(sub_index)));
                                         sub_index++;
                                     }
                                 }
@@ -1616,32 +1657,32 @@ public class PaperServiceImpl implements PaperService {
      * @return
      * @throws Exception
      */
-    public String setSubQuesNum(String quesBodyWordMl, int num) throws Exception {
-        String tmpStr = DocxProcessUtil.BODY_HEADER + quesBodyWordMl + DocxProcessUtil.BODY_TAIL;
-        Body body = (Body) XmlUtils.unmarshalString(tmpStr, Context.jc, Body.class);
-        List<Object> pList = body.getContent();
-        int index = 0;
-        for (Object pObj : pList) {
-            if (index > 0) {
-                break;
-            }
-            P p = (P) pObj;
-            List<Object> pContent = p.getContent();
-            R run = new R();
-            Text text = new Text();
-            text.setValue(num + ". ");
-            run.getContent().add(text);
-            pContent.add(0, run);
-            index++;
-        }
-        StringBuffer pWordMl = new StringBuffer();
-        for (Object pObj : pList) {
-            if (pObj instanceof P) {
-                pWordMl.append(DocxProcessUtil.formatPWordMl(XmlUtils.marshaltoString(pObj)));
-            }
-        }
-        return pWordMl.toString();
-    }
+//    public String setSubQuesNum(String quesBodyWordMl, int num) throws Exception {
+//        String tmpStr = DocxProcessUtil.BODY_HEADER + quesBodyWordMl + DocxProcessUtil.BODY_TAIL;
+//        Body body = (Body) XmlUtils.unmarshalString(tmpStr, Context.jc, Body.class);
+//        List<Object> pList = body.getContent();
+//        int index = 0;
+//        for (Object pObj : pList) {
+//            if (index > 0) {
+//                break;
+//            }
+//            P p = (P) pObj;
+//            List<Object> pContent = p.getContent();
+//            R run = new R();
+//            Text text = new Text();
+//            text.setValue(num + ". ");
+//            run.getContent().add(text);
+//            pContent.add(0, run);
+//            index++;
+//        }
+//        StringBuffer pWordMl = new StringBuffer();
+//        for (Object pObj : pList) {
+//            if (pObj instanceof P) {
+//                pWordMl.append(DocxProcessUtil.formatPWordMl(XmlUtils.marshaltoString(pObj)));
+//            }
+//        }
+//        return pWordMl.toString();
+//    }
 
     /**
      * 将数字1,2,3,4转化成A,B,C,D
@@ -1662,59 +1703,59 @@ public class PaperServiceImpl implements PaperService {
      * @return
      * @throws Exception
      */
-    public String setOptionNum(String optionWordMl, String num) throws Exception {
-        String tmpStr = DocxProcessUtil.BODY_HEADER + optionWordMl + DocxProcessUtil.BODY_TAIL;
-        Body body = (Body) XmlUtils.unmarshalString(tmpStr, Context.jc, Body.class);
-        List<Object> pList = body.getContent();
-        int index = 0;
-        for (Object pObj : pList) {
-            if (index > 0) {
-                break;
-            }
-            P p = (P) pObj;
-            List<Object> pContent = p.getContent();
-            R run = new R();
-            Text text = new Text();
-            text.setValue(num + ". ");
-            run.getContent().add(text);
-            pContent.add(0, run);
-            index++;
-        }
-        StringBuffer pWordMl = new StringBuffer();
-        for (Object pObj : pList) {
-            if (pObj instanceof P) {
-                pWordMl.append(DocxProcessUtil.formatPWordMl(XmlUtils.marshaltoString(pObj)));
-            }
-        }
-        return pWordMl.toString();
-    }
-
-    public String setAnswerNum(String quesBodyWordMl) throws Exception {
-        String tmpStr = DocxProcessUtil.BODY_HEADER + quesBodyWordMl + DocxProcessUtil.BODY_TAIL;
-        Body body = (Body) XmlUtils.unmarshalString(tmpStr, Context.jc, Body.class);
-        List<Object> pList = body.getContent();
-        int index = 0;
-        for (Object pObj : pList) {
-            if (index > 0) {
-                break;
-            }
-            P p = (P) pObj;
-            List<Object> pContent = p.getContent();
-            R run = new R();
-            Text text = new Text();
-            text.setValue("[答案]:");
-            run.getContent().add(text);
-            pContent.add(0, run);
-            index++;
-        }
-        StringBuffer pWordMl = new StringBuffer();
-        for (Object pObj : pList) {
-            if (pObj instanceof P) {
-                pWordMl.append(DocxProcessUtil.formatPWordMl(XmlUtils.marshaltoString(pObj)));
-            }
-        }
-        return pWordMl.toString();
-    }
+//    public String setOptionNum(String optionWordMl, String num) throws Exception {
+//        String tmpStr = DocxProcessUtil.BODY_HEADER + optionWordMl + DocxProcessUtil.BODY_TAIL;
+//        Body body = (Body) XmlUtils.unmarshalString(tmpStr, Context.jc, Body.class);
+//        List<Object> pList = body.getContent();
+//        int index = 0;
+//        for (Object pObj : pList) {
+//            if (index > 0) {
+//                break;
+//            }
+//            P p = (P) pObj;
+//            List<Object> pContent = p.getContent();
+//            R run = new R();
+//            Text text = new Text();
+//            text.setValue(num + ". ");
+//            run.getContent().add(text);
+//            pContent.add(0, run);
+//            index++;
+//        }
+//        StringBuffer pWordMl = new StringBuffer();
+//        for (Object pObj : pList) {
+//            if (pObj instanceof P) {
+//                pWordMl.append(DocxProcessUtil.formatPWordMl(XmlUtils.marshaltoString(pObj)));
+//            }
+//        }
+//        return pWordMl.toString();
+//    }
+
+//    public String setAnswerNum(String quesBodyWordMl) throws Exception {
+//        String tmpStr = DocxProcessUtil.BODY_HEADER + quesBodyWordMl + DocxProcessUtil.BODY_TAIL;
+//        Body body = (Body) XmlUtils.unmarshalString(tmpStr, Context.jc, Body.class);
+//        List<Object> pList = body.getContent();
+//        int index = 0;
+//        for (Object pObj : pList) {
+//            if (index > 0) {
+//                break;
+//            }
+//            P p = (P) pObj;
+//            List<Object> pContent = p.getContent();
+//            R run = new R();
+//            Text text = new Text();
+//            text.setValue("[答案]:");
+//            run.getContent().add(text);
+//            pContent.add(0, run);
+//            index++;
+//        }
+//        StringBuffer pWordMl = new StringBuffer();
+//        for (Object pObj : pList) {
+//            if (pObj instanceof P) {
+//                pWordMl.append(DocxProcessUtil.formatPWordMl(XmlUtils.marshaltoString(pObj)));
+//            }
+//        }
+//        return pWordMl.toString();
+//    }
 
     @Override
     public int getQuestionTypeNumbers(String paperId, Integer publicityType, Integer difficultyType) {

+ 150 - 145
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/impl/QuesServiceImpl.java

@@ -1,31 +1,16 @@
 package cn.com.qmth.examcloud.core.questions.service.impl;
 
-import cn.com.qmth.examcloud.api.commons.security.bean.User;
-import cn.com.qmth.examcloud.commons.exception.StatusException;
-import cn.com.qmth.examcloud.core.questions.base.CommonUtils;
-import cn.com.qmth.examcloud.core.questions.base.Model;
-import cn.com.qmth.examcloud.core.questions.base.enums.PaperType;
-import cn.com.qmth.examcloud.core.questions.base.question.enums.QuesStructType;
-import cn.com.qmth.examcloud.core.questions.base.word.DocxProcessUtil;
-import cn.com.qmth.examcloud.core.questions.dao.*;
-import cn.com.qmth.examcloud.core.questions.dao.entity.*;
-import cn.com.qmth.examcloud.core.questions.service.PaperService;
-import cn.com.qmth.examcloud.core.questions.service.QuesService;
-import cn.com.qmth.examcloud.core.questions.service.QuestionAudioService;
-import cn.com.qmth.examcloud.core.questions.service.bean.QuestionAnswerBean;
-import cn.com.qmth.examcloud.core.questions.service.bean.QuestionAnswerConvert;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+import java.util.regex.Pattern;
+
 import org.apache.commons.lang3.StringUtils;
 import org.bson.types.ObjectId;
-import org.docx4j.XmlUtils;
-import org.docx4j.dml.CTPositiveSize2D;
-import org.docx4j.dml.wordprocessingDrawing.Inline;
-import org.docx4j.jaxb.Context;
 import org.docx4j.openpackaging.exceptions.InvalidFormatException;
 import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
-import org.docx4j.wml.Body;
-import org.docx4j.wml.Drawing;
-import org.docx4j.wml.P;
-import org.docx4j.wml.R;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -41,9 +26,29 @@ import org.springframework.data.mongodb.core.query.Query;
 import org.springframework.data.mongodb.core.query.Update;
 import org.springframework.stereotype.Service;
 
-import javax.xml.bind.JAXBElement;
-import java.util.*;
-import java.util.regex.Pattern;
+import cn.com.qmth.examcloud.api.commons.security.bean.User;
+import cn.com.qmth.examcloud.commons.exception.StatusException;
+import cn.com.qmth.examcloud.core.questions.base.CommonUtils;
+import cn.com.qmth.examcloud.core.questions.base.Model;
+import cn.com.qmth.examcloud.core.questions.base.enums.PaperType;
+import cn.com.qmth.examcloud.core.questions.base.question.enums.QuesStructType;
+import cn.com.qmth.examcloud.core.questions.base.word.DocxProcessUtil;
+import cn.com.qmth.examcloud.core.questions.dao.PaperDetailUnitRepo;
+import cn.com.qmth.examcloud.core.questions.dao.PaperRepo;
+import cn.com.qmth.examcloud.core.questions.dao.QuesPkgPathRepo;
+import cn.com.qmth.examcloud.core.questions.dao.QuesRepo;
+import cn.com.qmth.examcloud.core.questions.dao.QuestionAudioRepo;
+import cn.com.qmth.examcloud.core.questions.dao.entity.Paper;
+import cn.com.qmth.examcloud.core.questions.dao.entity.PaperDetailUnit;
+import cn.com.qmth.examcloud.core.questions.dao.entity.QuesOption;
+import cn.com.qmth.examcloud.core.questions.dao.entity.Question;
+import cn.com.qmth.examcloud.core.questions.dao.entity.QuestionAudio;
+import cn.com.qmth.examcloud.core.questions.dao.entity.QuestionSearchCondition;
+import cn.com.qmth.examcloud.core.questions.service.PaperService;
+import cn.com.qmth.examcloud.core.questions.service.QuesService;
+import cn.com.qmth.examcloud.core.questions.service.QuestionAudioService;
+import cn.com.qmth.examcloud.core.questions.service.bean.QuestionAnswerBean;
+import cn.com.qmth.examcloud.core.questions.service.bean.QuestionAnswerConvert;
 
 /**
  * @author chenken
@@ -175,7 +180,7 @@ public class QuesServiceImpl implements QuesService {
         }
         setSelectQuestionAnswer(question, "");
         updateSubId(question);
-        updateQuesWord(question);
+//        updateQuesWord(question);
         // 更新QuesBody,把 下划线 转成 ##
         updateQuesBody(question);
         return quesRepo.save(question);
@@ -375,127 +380,127 @@ public class QuesServiceImpl implements QuesService {
      *
      * @param question
      */
-    public void updateQuesWord(Question question) {
-        try {
-            if (wordMLPackage == null) {
-                wordMLPackage = WordprocessingMLPackage.createPackage();
-            } else {
-                DocxProcessUtil.initTmpPackage(wordMLPackage);
-                wordMLPackage.getRelationshipsPart().remove();
-            }
-            updateQuesWordUnit(wordMLPackage, question);
-            List<Question> subQuesList = question.getSubQuestions();
-            if (subQuesList != null && subQuesList.size() > 0) {
-                for (Question subQues : subQuesList) {
-                    updateQuesWordUnit(wordMLPackage, subQues);
-                }
-            }
-            byte[] pkgByte = DocxProcessUtil.getPkgByte(wordMLPackage);
-            if (question.getQuesPkgPathId() == null) {
-                QuestionPkgPath quesPkgPath = new QuestionPkgPath(pkgByte);
-                QuestionPkgPath returnQuesPkgPath = quesPkgPathRepo.save(quesPkgPath);
-                question.setQuesPkgPathId(returnQuesPkgPath.getId());
-                quesRepo.save(question);
-            } else {
-                QuestionPkgPath quesPkgPath = quesPkgPathRepo.findFirstById(question.getQuesPkgPathId());
-                quesPkgPath.setQuesPkg(pkgByte);
-                quesPkgPathRepo.save(quesPkgPath);
-            }
-            pkgByte = null;
-        } catch (Exception e) {
-            log.error(e.getMessage(), e);
-        }
-    }
-
-    public void updateQuesWordUnit(WordprocessingMLPackage wordMLPackage, Question question) throws Exception {
-        String quesBody = question.getQuesBody();
-        String quesAnswer = question.getQuesAnswer();
-        if (!StringUtils.isEmpty(quesBody)) {
-            StringBuffer pWordMl = new StringBuffer();
-            question.setQuesBodyWord(reduceImage(quesBody, pWordMl, wordMLPackage));
-        }
-        if (!StringUtils.isEmpty(quesAnswer) && (question.getQuestionType() == QuesStructType.FILL_BLANK_QUESTION
-                || question.getQuestionType() == QuesStructType.TEXT_ANSWER_QUESTION)) {
-            // question.setQuesAnswerWord(DocxProcessUtil.html2Docx(wordMLPackage,
-            // CommonUtils.formatHtml(quesAnswer)));
-            StringBuffer pWordMl = new StringBuffer();
-            question.setQuesAnswerWord(reduceImage(quesAnswer, pWordMl, wordMLPackage));
-        }
-        if (!StringUtils.isEmpty(quesAnswer) && question.getQuestionType() == QuesStructType.BOOL_ANSWER_QUESTION) {
-            quesAnswer = "<p>" + quesAnswer + "</p>";
-            question.setQuesAnswerWord(DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(quesAnswer)));
-        }
-        if (!StringUtils.isEmpty(quesAnswer) && (question.getQuestionType() == QuesStructType.SINGLE_ANSWER_QUESTION
-                || question.getQuestionType() == QuesStructType.MULTIPLE_ANSWER_QUESTION)) {
-            question.setQuesAnswerWord(makeQuesAnswerWord(quesAnswer));
-        }
-        List<QuesOption> quesOptions = question.getQuesOptions();
-        if (quesOptions != null && quesOptions.size() > 0) {
-            for (QuesOption quesOption : quesOptions) {
-                if (StringUtils.isBlank(quesOption.getOptionBody())) {
-                    quesOption.setOptionBody("<p></p>");
-                }
-                StringBuffer pWordMl = new StringBuffer();
-                // quesOption.setOptionBodyWord(DocxProcessUtil.html2Docx(wordMLPackage,CommonUtils.formatHtml(quesOption.getOptionBody())));
-                quesOption.setOptionBodyWord(reduceImage(quesOption.getOptionBody(), pWordMl, wordMLPackage));
-            }
-        }
-    }
+//    public void updateQuesWord(Question question) {
+//        try {
+//            if (wordMLPackage == null) {
+//                wordMLPackage = WordprocessingMLPackage.createPackage();
+//            } else {
+//                DocxProcessUtil.initTmpPackage(wordMLPackage);
+//                wordMLPackage.getRelationshipsPart().remove();
+//            }
+//            updateQuesWordUnit(wordMLPackage, question);
+//            List<Question> subQuesList = question.getSubQuestions();
+//            if (subQuesList != null && subQuesList.size() > 0) {
+//                for (Question subQues : subQuesList) {
+//                    updateQuesWordUnit(wordMLPackage, subQues);
+//                }
+//            }
+//            byte[] pkgByte = DocxProcessUtil.getPkgByte(wordMLPackage);
+//            if (question.getQuesPkgPathId() == null) {
+//                QuestionPkgPath quesPkgPath = new QuestionPkgPath(pkgByte);
+//                QuestionPkgPath returnQuesPkgPath = quesPkgPathRepo.save(quesPkgPath);
+//                question.setQuesPkgPathId(returnQuesPkgPath.getId());
+//                quesRepo.save(question);
+//            } else {
+//                QuestionPkgPath quesPkgPath = quesPkgPathRepo.findFirstById(question.getQuesPkgPathId());
+//                quesPkgPath.setQuesPkg(pkgByte);
+//                quesPkgPathRepo.save(quesPkgPath);
+//            }
+//            pkgByte = null;
+//        } catch (Exception e) {
+//            log.error(e.getMessage(), e);
+//        }
+//    }
+
+//    public void updateQuesWordUnit(WordprocessingMLPackage wordMLPackage, Question question) throws Exception {
+//        String quesBody = question.getQuesBody();
+//        String quesAnswer = question.getQuesAnswer();
+//        if (!StringUtils.isEmpty(quesBody)) {
+//            StringBuffer pWordMl = new StringBuffer();
+//            question.setQuesBodyWord(reduceImage(quesBody, pWordMl, wordMLPackage));
+//        }
+//        if (!StringUtils.isEmpty(quesAnswer) && (question.getQuestionType() == QuesStructType.FILL_BLANK_QUESTION
+//                || question.getQuestionType() == QuesStructType.TEXT_ANSWER_QUESTION)) {
+//            // question.setQuesAnswerWord(DocxProcessUtil.html2Docx(wordMLPackage,
+//            // CommonUtils.formatHtml(quesAnswer)));
+//            StringBuffer pWordMl = new StringBuffer();
+//            question.setQuesAnswerWord(reduceImage(quesAnswer, pWordMl, wordMLPackage));
+//        }
+//        if (!StringUtils.isEmpty(quesAnswer) && question.getQuestionType() == QuesStructType.BOOL_ANSWER_QUESTION) {
+//            quesAnswer = "<p>" + quesAnswer + "</p>";
+//            question.setQuesAnswerWord(DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(quesAnswer)));
+//        }
+//        if (!StringUtils.isEmpty(quesAnswer) && (question.getQuestionType() == QuesStructType.SINGLE_ANSWER_QUESTION
+//                || question.getQuestionType() == QuesStructType.MULTIPLE_ANSWER_QUESTION)) {
+//            question.setQuesAnswerWord(makeQuesAnswerWord(quesAnswer));
+//        }
+//        List<QuesOption> quesOptions = question.getQuesOptions();
+//        if (quesOptions != null && quesOptions.size() > 0) {
+//            for (QuesOption quesOption : quesOptions) {
+//                if (StringUtils.isBlank(quesOption.getOptionBody())) {
+//                    quesOption.setOptionBody("<p></p>");
+//                }
+//                StringBuffer pWordMl = new StringBuffer();
+//                // quesOption.setOptionBodyWord(DocxProcessUtil.html2Docx(wordMLPackage,CommonUtils.formatHtml(quesOption.getOptionBody())));
+//                quesOption.setOptionBodyWord(reduceImage(quesOption.getOptionBody(), pWordMl, wordMLPackage));
+//            }
+//        }
+//    }
 
     // 如果图片过大,改变图片大小
-    private String reduceImage(String html, StringBuffer pWordMl, WordprocessingMLPackage wordMLPackage)
-            throws Exception {
-        String bodyString = DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(html));
-        if (bodyString.indexOf("cx") > -1 || bodyString.indexOf("cy") > -1) {
-            String tmpStr = DocxProcessUtil.BODY_HEADER + bodyString + DocxProcessUtil.BODY_TAIL;
-            Body body = (Body) XmlUtils.unmarshalString(tmpStr, Context.jc, Body.class);
-            List<Object> pList = body.getContent();
-            for (Object op : pList) {
-                P p = (P) op;
-                List<Object> rList = p.getContent();
-                for (Object or : rList) {
-                    if (or instanceof R) {
-                        R r = (R) or;
-                        List<Object> draList = r.getContent();
-                        for (Object odra : draList) {
-                            if (odra instanceof JAXBElement) {
-                                JAXBElement<?> jaxbElement = (JAXBElement<?>) odra;
-                                if (jaxbElement.getValue() instanceof Drawing) {
-                                    Drawing drawing = (Drawing) jaxbElement.getValue();
-                                    List<Object> inList = drawing.getAnchorOrInline();
-                                    for (Object oin : inList) {
-                                        Inline inline = (Inline) oin;
-                                        CTPositiveSize2D extent = inline.getExtent();
-                                        if (extent.getCx() > 6000000) {
-                                            long cx = extent.getCx();
-                                            long cy = extent.getCy();
-                                            Double ncy = (cy * 6000000D) / cx;
-                                            extent.setCx(6000000L);
-                                            extent.setCy(ncy.longValue());
-                                        }
-                                        if (extent.getCy() > 6000000) {
-                                            long cx = extent.getCx();
-                                            long cy = extent.getCy();
-                                            Double ncx = (cx * 6000000D) / cy;
-                                            extent.setCy(6000000L);
-                                            extent.setCx(ncx.longValue());
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-            for (Object pObj : pList) {
-                if (pObj instanceof P) {
-                    pWordMl.append(DocxProcessUtil.formatPWordMl(XmlUtils.marshaltoString(pObj)));
-                }
-            }
-            return pWordMl.toString();
-        }
-        return bodyString;
-    }
+//    private String reduceImage(String html, StringBuffer pWordMl, WordprocessingMLPackage wordMLPackage)
+//            throws Exception {
+//        String bodyString = DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(html));
+//        if (bodyString.indexOf("cx") > -1 || bodyString.indexOf("cy") > -1) {
+//            String tmpStr = DocxProcessUtil.BODY_HEADER + bodyString + DocxProcessUtil.BODY_TAIL;
+//            Body body = (Body) XmlUtils.unmarshalString(tmpStr, Context.jc, Body.class);
+//            List<Object> pList = body.getContent();
+//            for (Object op : pList) {
+//                P p = (P) op;
+//                List<Object> rList = p.getContent();
+//                for (Object or : rList) {
+//                    if (or instanceof R) {
+//                        R r = (R) or;
+//                        List<Object> draList = r.getContent();
+//                        for (Object odra : draList) {
+//                            if (odra instanceof JAXBElement) {
+//                                JAXBElement<?> jaxbElement = (JAXBElement<?>) odra;
+//                                if (jaxbElement.getValue() instanceof Drawing) {
+//                                    Drawing drawing = (Drawing) jaxbElement.getValue();
+//                                    List<Object> inList = drawing.getAnchorOrInline();
+//                                    for (Object oin : inList) {
+//                                        Inline inline = (Inline) oin;
+//                                        CTPositiveSize2D extent = inline.getExtent();
+//                                        if (extent.getCx() > 6000000) {
+//                                            long cx = extent.getCx();
+//                                            long cy = extent.getCy();
+//                                            Double ncy = (cy * 6000000D) / cx;
+//                                            extent.setCx(6000000L);
+//                                            extent.setCy(ncy.longValue());
+//                                        }
+//                                        if (extent.getCy() > 6000000) {
+//                                            long cx = extent.getCx();
+//                                            long cy = extent.getCy();
+//                                            Double ncx = (cx * 6000000D) / cy;
+//                                            extent.setCy(6000000L);
+//                                            extent.setCx(ncx.longValue());
+//                                        }
+//                                    }
+//                                }
+//                            }
+//                        }
+//                    }
+//                }
+//            }
+//            for (Object pObj : pList) {
+//                if (pObj instanceof P) {
+//                    pWordMl.append(DocxProcessUtil.formatPWordMl(XmlUtils.marshaltoString(pObj)));
+//                }
+//            }
+//            return pWordMl.toString();
+//        }
+//        return bodyString;
+//    }
 
     private String makeQuesAnswerWord(String quesAnswer) {
         String template = "<w:p xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" w:rsidR=\"00F65544\" w:rsidP=\"00F65544\" w:rsidRDefault=\"001738E2\">"

+ 309 - 319
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/temp/CqdxService.java

@@ -1,160 +1,150 @@
 package cn.com.qmth.examcloud.core.questions.service.temp;
 
-import cn.com.qmth.examcloud.core.questions.base.CommonUtils;
-import cn.com.qmth.examcloud.core.questions.base.IdUtils;
-import cn.com.qmth.examcloud.core.questions.base.enums.PaperStatus;
-import cn.com.qmth.examcloud.core.questions.base.enums.PaperType;
-import cn.com.qmth.examcloud.core.questions.base.question.enums.QuesStructType;
-import cn.com.qmth.examcloud.core.questions.base.word.DocxProcessUtil;
-import cn.com.qmth.examcloud.core.questions.dao.*;
-import cn.com.qmth.examcloud.core.questions.dao.entity.*;
-import cn.com.qmth.examcloud.core.questions.service.impl.CourseService;
+import java.io.File;
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
 import org.apache.commons.collections4.map.HashedMap;
 import org.apache.commons.lang3.StringUtils;
-import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.w3c.dom.Document;
 import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import java.io.File;
-import java.io.UnsupportedEncodingException;
-import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
+import cn.com.qmth.examcloud.core.questions.base.question.enums.QuesStructType;
 
 @Component
 public class CqdxService {
     private static final Logger log = LoggerFactory.getLogger(CqdxService.class);
     final Long rootOrgId = 1407L;
     final String rootDir = "D:/paper/cqu/temps";
-    @Autowired
-    private CourseService courseService;
-    @Autowired
-    private QuesRepo quesRepo;
-    @Autowired
-    private PaperRepo paperRepo;
-    @Autowired
-    private PaperDetailRepo paperDetailRepo;
-    @Autowired
-    private PaperDetailUnitRepo paperDetailUnitRepo;
-    @Autowired
-    private QuesPkgPathRepo quesPkgPathRepo;
-
-    public void bulidPaper() throws Exception {
-        // 获取所有xml的路径
-        List<String> files = this.loadFiles();
-
-        //试卷名称(后缀)
-        final String paperNameSuffix = "192";
-
-        int i = 0;
-        log.debug("XML的文件数:" + files.size());
-        for (String filePath : files) {
-            log.debug("第" + (++i) + "个xml文件开始处理,文件名为:" + filePath);
-
-//            if (i < 30) {
-//                continue;
+//    @Autowired
+//    private CourseService courseService;
+//    @Autowired
+//    private QuesRepo quesRepo;
+//    @Autowired
+//    private PaperRepo paperRepo;
+//    @Autowired
+//    private PaperDetailRepo paperDetailRepo;
+//    @Autowired
+//    private PaperDetailUnitRepo paperDetailUnitRepo;
+//    @Autowired
+//    private QuesPkgPathRepo quesPkgPathRepo;
+
+//    public void bulidPaper() throws Exception {
+//        // 获取所有xml的路径
+//        List<String> files = this.loadFiles();
+//
+//        //试卷名称(后缀)
+//        final String paperNameSuffix = "192";
+//
+//        int i = 0;
+//        log.debug("XML的文件数:" + files.size());
+//        for (String filePath : files) {
+//            log.debug("第" + (++i) + "个xml文件开始处理,文件名为:" + filePath);
+//
+////            if (i < 30) {
+////                continue;
+////            }
+//
+//            Map<Object, Object> paperInfoMap = this.readXml(filePath, paperNameSuffix);
+//            // 查询课程
+//            Course course = courseService.getCourse(rootOrgId, paperInfoMap.get("courseCode").toString());
+//            // 初始化试卷
+//            Paper paper = initPaper(paperInfoMap, course);
+//            // 大题集合
+//            List<PaperDetail> paperDetails = initPaperDetails(paperInfoMap, paper);
+//            // 试题---资源 对应关系
+//            Map<Question, QuestionPkgPath> questionMaps = new HashMap<>();
+//
+//            // 定义小题集合
+//            List<PaperDetailUnit> paperDetailUnits;
+//            try {
+//                paperDetailUnits = initpaperDetailUnits(paper, paperDetails, questionMaps, paperInfoMap, course);
+//                if (paperDetailUnits == null) {
+//                    log.debug("-->有错误的XML:" + filePath);
+//                    break;
+//                }
+//            } catch (Exception e) {
+//                log.debug("==>有错误的XML:" + filePath + " Error:" + e.getMessage());
+//                break;
 //            }
-
-            Map<Object, Object> paperInfoMap = this.readXml(filePath, paperNameSuffix);
-            // 查询课程
-            Course course = courseService.getCourse(rootOrgId, paperInfoMap.get("courseCode").toString());
-            // 初始化试卷
-            Paper paper = initPaper(paperInfoMap, course);
-            // 大题集合
-            List<PaperDetail> paperDetails = initPaperDetails(paperInfoMap, paper);
-            // 试题---资源 对应关系
-            Map<Question, QuestionPkgPath> questionMaps = new HashMap<>();
-
-            // 定义小题集合
-            List<PaperDetailUnit> paperDetailUnits;
-            try {
-                paperDetailUnits = initpaperDetailUnits(paper, paperDetails, questionMaps, paperInfoMap, course);
-                if (paperDetailUnits == null) {
-                    log.debug("-->有错误的XML:" + filePath);
-                    break;
-                }
-            } catch (Exception e) {
-                log.debug("==>有错误的XML:" + filePath + " Error:" + e.getMessage());
-                break;
-            }
-
-            // 保存试题资源
-            /*quesPkgPathRepo.saveAll(questionMaps.values());
-            for (Map.Entry<Question, QuestionPkgPath> entry : questionMaps.entrySet()) {
-                entry.getKey().setQuesPkgPathId(entry.getValue().getId());
-            }
-            quesRepo.saveAll(questionMaps.keySet());
-            paperRepo.save(paper);
-            paperDetailRepo.saveAll(paperDetails);
-            paperDetailUnitRepo.saveAll(paperDetailUnits);*/
-
-            // 将正常文件移动到新目录
-            /*File okFile = new File(rootDir + "/" + filePath);
-            String newFilePath = rootDir + "/ok/" + okFile.getName();
-            File newFile = new File(newFilePath);
-            okFile.renameTo(newFile);*/
-
-            log.debug("第" + i + "个xml文件已经处理完,文件名为:" + filePath);
-        }
-        log.debug("处理完成...");
-    }
+//
+//            // 保存试题资源
+//            /*quesPkgPathRepo.saveAll(questionMaps.values());
+//            for (Map.Entry<Question, QuestionPkgPath> entry : questionMaps.entrySet()) {
+//                entry.getKey().setQuesPkgPathId(entry.getValue().getId());
+//            }
+//            quesRepo.saveAll(questionMaps.keySet());
+//            paperRepo.save(paper);
+//            paperDetailRepo.saveAll(paperDetails);
+//            paperDetailUnitRepo.saveAll(paperDetailUnits);*/
+//
+//            // 将正常文件移动到新目录
+//            /*File okFile = new File(rootDir + "/" + filePath);
+//            String newFilePath = rootDir + "/ok/" + okFile.getName();
+//            File newFile = new File(newFilePath);
+//            okFile.renameTo(newFile);*/
+//
+//            log.debug("第" + i + "个xml文件已经处理完,文件名为:" + filePath);
+//        }
+//        log.debug("处理完成...");
+//    }
 
     // 初始化试卷
-    private Paper initPaper(Map<Object, Object> paperInfoMap, Course course) {
-        Paper paper = new Paper();
-        paper.setName((String) paperInfoMap.get("name"));
-        paper.setTitle((String) paperInfoMap.get("name"));
-        paper.setPaperType(PaperType.IMPORT);
-        paper.setPaperStatus(PaperStatus.DRAFT);
-        paper.setOrgId(course.getOrgId());
-        paper.setCreator("feng");
-        paper.setTotalScore(Double.valueOf((String) paperInfoMap
-                .get("totalScore")));
-        paper.setCourse(course);
-        paper.setCourseName(course.getName());
-        paper.setCourseNo(course.getCode());
-        paper.setCreateTime(CommonUtils.getCurDateTime());
-        paper.setPaperDetailCount(Integer.valueOf((String) paperInfoMap
-                .get("detailCount")));
-        paper.setUnitCount(Integer.valueOf((String) paperInfoMap
-                .get("unitCount")));
-        paper.setDifficultyDegree(0.5);
-        return paper;
-    }
-
-    // 初始化大题集合
-    private List<PaperDetail> initPaperDetails(
-            Map<Object, Object> paperInfoMap, Paper paper) {
-        // 定义大题集合
-        List<PaperDetail> paperDetails = new ArrayList<PaperDetail>();
-        int length = paperInfoMap.size() - 5;
-        for (int i = 0; i < length; i++) {
-            QuestionsTemp detailInfo = (QuestionsTemp) paperInfoMap.get(String
-                    .valueOf(i + 1));
-            PaperDetail paperDetail = new PaperDetail();
-            paperDetail.setPaper(paper);
-            paperDetail.setNumber(Integer.valueOf(detailInfo.getNumber()));
-            paperDetail.setName(detailInfo.getName());
-            paperDetail.setScore(Double.valueOf(detailInfo.getTotalScore()));
-            paperDetail.setUnitCount(Integer.valueOf(detailInfo.getCount()));
-            paperDetail.setCreator("feng");
-            paperDetail.setCreateTime(CommonUtils.getCurDateTime());
-            paperDetails.add(paperDetail);
-        }
-        return paperDetails;
-    }
+//    private Paper initPaper(Map<Object, Object> paperInfoMap, Course course) {
+//        Paper paper = new Paper();
+//        paper.setName((String) paperInfoMap.get("name"));
+//        paper.setTitle((String) paperInfoMap.get("name"));
+//        paper.setPaperType(PaperType.IMPORT);
+//        paper.setPaperStatus(PaperStatus.DRAFT);
+//        paper.setOrgId(course.getOrgId());
+//        paper.setCreator("feng");
+//        paper.setTotalScore(Double.valueOf((String) paperInfoMap
+//                .get("totalScore")));
+//        paper.setCourse(course);
+//        paper.setCourseName(course.getName());
+//        paper.setCourseNo(course.getCode());
+//        paper.setCreateTime(CommonUtils.getCurDateTime());
+//        paper.setPaperDetailCount(Integer.valueOf((String) paperInfoMap
+//                .get("detailCount")));
+//        paper.setUnitCount(Integer.valueOf((String) paperInfoMap
+//                .get("unitCount")));
+//        paper.setDifficultyDegree(0.5);
+//        return paper;
+//    }
+//
+//    // 初始化大题集合
+//    private List<PaperDetail> initPaperDetails(
+//            Map<Object, Object> paperInfoMap, Paper paper) {
+//        // 定义大题集合
+//        List<PaperDetail> paperDetails = new ArrayList<PaperDetail>();
+//        int length = paperInfoMap.size() - 5;
+//        for (int i = 0; i < length; i++) {
+//            QuestionsTemp detailInfo = (QuestionsTemp) paperInfoMap.get(String
+//                    .valueOf(i + 1));
+//            PaperDetail paperDetail = new PaperDetail();
+//            paperDetail.setPaper(paper);
+//            paperDetail.setNumber(Integer.valueOf(detailInfo.getNumber()));
+//            paperDetail.setName(detailInfo.getName());
+//            paperDetail.setScore(Double.valueOf(detailInfo.getTotalScore()));
+//            paperDetail.setUnitCount(Integer.valueOf(detailInfo.getCount()));
+//            paperDetail.setCreator("feng");
+//            paperDetail.setCreateTime(CommonUtils.getCurDateTime());
+//            paperDetails.add(paperDetail);
+//        }
+//        return paperDetails;
+//    }
 
     public Map<Object, Object> readXml(String xmlPath, String paperNameSuffix) throws Exception {
         Map<Object, Object> paperInfoMap = new HashedMap<>();
@@ -347,189 +337,189 @@ public class CqdxService {
     }
 
     // 初始化小题集合
-    private List<PaperDetailUnit> initpaperDetailUnits(Paper paper, List<PaperDetail> paperDetails, Map<Question, QuestionPkgPath> map,
-                                                       Map<Object, Object> paperInfoMap, Course course) throws Exception {
-        List<PaperDetailUnit> paperDetailUnits = new ArrayList<PaperDetailUnit>();
-        int detailCount = paperDetails.size();
-        int nm = 0;
-        for (int i = 0; i < detailCount; i++) {
-            PaperDetail detail = paperDetails.get(i);
-            QuestionsTemp detailTemp = (QuestionsTemp) paperInfoMap.get(String
-                    .valueOf(i + 1));
-            Map<Object, Object> detailInfoMap = detailTemp.getQues();
-            int quesCount = detailInfoMap.size();
-            for (int j = 0; j < quesCount; j++) {
-                WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage
-                        .createPackage();
-                QuestionsTemp quesTemp = (QuestionsTemp) detailInfoMap
-                        .get(String.valueOf(j + 1));
-                Question question = new Question();
-                question.setCreateTime(CommonUtils.getCurDateTime());
-                question.setScore(Double.valueOf(quesTemp.getScore()));
-                question.setCourse(course);
-                question.setOrgId(course.getOrgId());
-                question.setHasAudio(false);
-                question.setDifficulty("中");
-                question.setDifficultyDegree(0.5);
-                question.setPublicity(true);
-                question.setQuestionType(quesTemp.getType());
-
-                String body = imgList(quesTemp.getBody());
-                question.setQuesBody(replaceBlank(body));
-                try {
-                    question.setQuesBodyWord(DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(question.getQuesBody())));
-                } catch (Exception e) {
-                    log.debug("错误题干信息:" + question.getQuesBody());
-                    throw new IllegalArgumentException("题干信息错误!");
-                }
-                if (question.getQuestionType() == QuesStructType.BOOL_ANSWER_QUESTION) {
-                    question.setQuesAnswer(quesTemp.getAnswer());
-                    question.setQuesAnswerWord(DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml("<p>" + question.getQuesAnswer() + "</p>")));
-                } else {
-                    question.setQuesAnswer(imgList(quesTemp.getAnswer()));
-                    try {
-                        question.setQuesAnswerWord(DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(question.getQuesAnswer())));
-                    } catch (Exception e) {
-                        log.debug("错误答案信息:" + question.getQuesAnswer());
-                        throw new IllegalArgumentException("答案信息错误!");
-                    }
-                }
-                // 存在选项
-                if (question.getQuestionType() == QuesStructType.SINGLE_ANSWER_QUESTION
-                        || question.getQuestionType() == QuesStructType.MULTIPLE_ANSWER_QUESTION) {
-                    List<QuesOption> quesOptions = new ArrayList<QuesOption>();
-                    Map<Object, Object> optionMap = quesTemp.getOptions();
-                    int optionCount = optionMap.size();
-                    for (int k = 0; k < optionCount; k++) {
-                        QuesOption quesOption = new QuesOption();
-                        quesOption.setNumber(String.valueOf(k + 1));
-
-                        String optionBody = imgList((String) optionMap.get(String.valueOf(k + 1)));
-                        if (optionBody.startsWith("<p><p") || optionBody.startsWith("<P><P")) {
-                            quesOption.setOptionBody(replaceFirstP(optionBody));
-                        } else {
-                            quesOption.setOptionBody(optionBody);
-                        }
-
-                        try {
-                            quesOption.setOptionBodyWord(DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(quesOption.getOptionBody())));
-                        } catch (Exception e) {
-                            log.debug("错误的选项:" + quesOption.getOptionBody());
-                            throw new IllegalArgumentException("选项信息错误!");
-                        }
-                        if (question.getQuesAnswer().contains(String.valueOf(k + 1))) {
-                            quesOption.setIsCorrect((short) 1);
-                        } else {
-                            quesOption.setIsCorrect((short) 0);
-                        }
-                        quesOptions.add(quesOption);
-                    }
-                    question.setQuesOptions(quesOptions);
-                    String[] answers = question.getQuesAnswer()
-                            .replaceAll("<p>", "").replaceAll("</p>", "")
-                            .replaceAll("<P>", "").replaceAll("</P>", "")
-                            .split(",");
-                    String answer = "";
-                    for (int a = 0; a < answers.length; a++) {
-                        char c1 = (char) (Integer.valueOf(answers[a]) + 64);
-                        if (a == 0) {
-                            answer = String.valueOf(c1);
-                        } else {
-                            answer = answer + "," + c1;
-                        }
-                    }
-                    question.setQuesAnswer("<p>" + answer + "</p>");
-                    question.setQuesAnswerWord(DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(question.getQuesAnswer())));
-                }
-                // 存在子题
-                if (question.getQuestionType() == QuesStructType.NESTED_ANSWER_QUESTION) {
-                    List<Question> subQuestions = new ArrayList<>();
-                    int subQuesCount = quesTemp.getSubQues().size();
-                    BigDecimal totalScore = BigDecimal.valueOf(question.getScore());
-                    BigDecimal sum = BigDecimal.valueOf(subQuesCount);
-                    double score = totalScore.divide(sum).doubleValue();
-                    for (int s = 0; s < subQuesCount; s++) {
-                        QuestionsTemp subQuesTmp = (QuestionsTemp) quesTemp.getSubQues().get(String.valueOf(s + 1));
-                        Question subQuestion = new Question();
-                        subQuestion.setId(IdUtils.uuid());
-                        subQuestion.setQuestionType(subQuesTmp.getType());
-                        subQuestion.setDifficulty("中");
-                        subQuestion.setDifficultyDegree(0.5);
-                        subQuestion.setPublicity(true);
-                        subQuestion.setScore(score);
-
-                        String subBody = imgList(subQuesTmp.getBody());
-                        question.setQuesBody(replaceBlank(body));
-                        subQuestion.setQuesBody(subBody);
-
-                        subQuestion.setQuesBodyWord(DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(subQuestion.getQuesBody())));
-                        subQuestion.setQuesAnswer(imgList(subQuesTmp.getAnswer()));
-                        subQuestion.setQuesBodyWord(DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(subQuestion.getQuesAnswer())));
-                        // 存在选项
-                        if (subQuestion.getQuestionType() == QuesStructType.SINGLE_ANSWER_QUESTION
-                                || subQuestion.getQuestionType() == QuesStructType.MULTIPLE_ANSWER_QUESTION) {
-                            List<QuesOption> subQuesOptions = new ArrayList<QuesOption>();
-                            Map<Object, Object> subOptionMap = subQuesTmp.getOptions();
-                            int subOptionCount = subOptionMap.size();
-                            for (int k = 0; k < subOptionCount; k++) {
-                                QuesOption subQuesOption = new QuesOption();
-                                subQuesOption.setNumber(String.valueOf(k));
-
-                                String optionBody = imgList((String) subOptionMap.get(String.valueOf(k + 1)));
-                                if (optionBody.startsWith("<p><p") || optionBody.startsWith("<P><P")) {
-                                    subQuesOption.setOptionBody(replaceFirstP(optionBody));
-                                } else {
-                                    subQuesOption.setOptionBody(optionBody);
-                                }
-
-                                subQuesOption.setOptionBodyWord(DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(subQuesOption.getOptionBody())));
-                                if (subQuestion.getQuesAnswer().contains(String.valueOf(k + 1))) {
-                                    subQuesOption.setIsCorrect((short) 1);
-                                } else {
-                                    subQuesOption.setIsCorrect((short) 0);
-                                }
-                                subQuesOptions.add(subQuesOption);
-                            }
-                            subQuestion.setQuesOptions(subQuesOptions);
-                            String[] answers = subQuestion.getQuesAnswer()
-                                    .replaceAll("<p>", "").replaceAll("</p>", "")
-                                    .replaceAll("<P>", "").replaceAll("</P>", "")
-                                    .split(",");
-                            String answer = "";
-                            for (int a = 0; a < answers.length; a++) {
-                                char c1 = (char) (Integer.valueOf(answers[a]) + 64);
-                                if (a == 0) {
-                                    answer = String.valueOf(c1);
-                                } else {
-                                    answer = answer + "," + c1;
-                                }
-                            }
-                            subQuestion.setQuesAnswer(answer);
-                            subQuestion.setQuesAnswerWord(DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml("<p>" + subQuestion.getQuesAnswer() + "</p>")));
-                        }
-                        subQuestions.add(subQuestion);
-                    }
-                    question.setSubQuestions(subQuestions);
-                }
-                byte[] pkgByte = DocxProcessUtil.getPkgByte(wordMLPackage);
-                QuestionPkgPath quesPkgPath = new QuestionPkgPath(pkgByte);
-                map.put(question, quesPkgPath);
-                // 包装小题
-                PaperDetailUnit paperDetailUnit = new PaperDetailUnit();
-                paperDetailUnit.setPaper(paper);
-                paperDetailUnit.setNumber(nm + 1);
-                paperDetailUnit.setScore(question.getScore());
-                paperDetailUnit.setPaperDetail(detail);
-                paperDetailUnit.setQuestionType(question.getQuestionType());
-                paperDetailUnit.setCreator("feng");
-                paperDetailUnit.setCreateTime(CommonUtils.getCurDateTime());
-                paperDetailUnit.setQuestion(question);
-                paperDetailUnits.add(paperDetailUnit);
-                nm++;
-            }
-        }
-        return paperDetailUnits;
-    }
+//    private List<PaperDetailUnit> initpaperDetailUnits(Paper paper, List<PaperDetail> paperDetails, Map<Question, QuestionPkgPath> map,
+//                                                       Map<Object, Object> paperInfoMap, Course course) throws Exception {
+//        List<PaperDetailUnit> paperDetailUnits = new ArrayList<PaperDetailUnit>();
+//        int detailCount = paperDetails.size();
+//        int nm = 0;
+//        for (int i = 0; i < detailCount; i++) {
+//            PaperDetail detail = paperDetails.get(i);
+//            QuestionsTemp detailTemp = (QuestionsTemp) paperInfoMap.get(String
+//                    .valueOf(i + 1));
+//            Map<Object, Object> detailInfoMap = detailTemp.getQues();
+//            int quesCount = detailInfoMap.size();
+//            for (int j = 0; j < quesCount; j++) {
+//                WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage
+//                        .createPackage();
+//                QuestionsTemp quesTemp = (QuestionsTemp) detailInfoMap
+//                        .get(String.valueOf(j + 1));
+//                Question question = new Question();
+//                question.setCreateTime(CommonUtils.getCurDateTime());
+//                question.setScore(Double.valueOf(quesTemp.getScore()));
+//                question.setCourse(course);
+//                question.setOrgId(course.getOrgId());
+//                question.setHasAudio(false);
+//                question.setDifficulty("中");
+//                question.setDifficultyDegree(0.5);
+//                question.setPublicity(true);
+//                question.setQuestionType(quesTemp.getType());
+//
+//                String body = imgList(quesTemp.getBody());
+//                question.setQuesBody(replaceBlank(body));
+//                try {
+//                    question.setQuesBodyWord(DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(question.getQuesBody())));
+//                } catch (Exception e) {
+//                    log.debug("错误题干信息:" + question.getQuesBody());
+//                    throw new IllegalArgumentException("题干信息错误!");
+//                }
+//                if (question.getQuestionType() == QuesStructType.BOOL_ANSWER_QUESTION) {
+//                    question.setQuesAnswer(quesTemp.getAnswer());
+//                    question.setQuesAnswerWord(DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml("<p>" + question.getQuesAnswer() + "</p>")));
+//                } else {
+//                    question.setQuesAnswer(imgList(quesTemp.getAnswer()));
+//                    try {
+//                        question.setQuesAnswerWord(DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(question.getQuesAnswer())));
+//                    } catch (Exception e) {
+//                        log.debug("错误答案信息:" + question.getQuesAnswer());
+//                        throw new IllegalArgumentException("答案信息错误!");
+//                    }
+//                }
+//                // 存在选项
+//                if (question.getQuestionType() == QuesStructType.SINGLE_ANSWER_QUESTION
+//                        || question.getQuestionType() == QuesStructType.MULTIPLE_ANSWER_QUESTION) {
+//                    List<QuesOption> quesOptions = new ArrayList<QuesOption>();
+//                    Map<Object, Object> optionMap = quesTemp.getOptions();
+//                    int optionCount = optionMap.size();
+//                    for (int k = 0; k < optionCount; k++) {
+//                        QuesOption quesOption = new QuesOption();
+//                        quesOption.setNumber(String.valueOf(k + 1));
+//
+//                        String optionBody = imgList((String) optionMap.get(String.valueOf(k + 1)));
+//                        if (optionBody.startsWith("<p><p") || optionBody.startsWith("<P><P")) {
+//                            quesOption.setOptionBody(replaceFirstP(optionBody));
+//                        } else {
+//                            quesOption.setOptionBody(optionBody);
+//                        }
+//
+//                        try {
+//                            quesOption.setOptionBodyWord(DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(quesOption.getOptionBody())));
+//                        } catch (Exception e) {
+//                            log.debug("错误的选项:" + quesOption.getOptionBody());
+//                            throw new IllegalArgumentException("选项信息错误!");
+//                        }
+//                        if (question.getQuesAnswer().contains(String.valueOf(k + 1))) {
+//                            quesOption.setIsCorrect((short) 1);
+//                        } else {
+//                            quesOption.setIsCorrect((short) 0);
+//                        }
+//                        quesOptions.add(quesOption);
+//                    }
+//                    question.setQuesOptions(quesOptions);
+//                    String[] answers = question.getQuesAnswer()
+//                            .replaceAll("<p>", "").replaceAll("</p>", "")
+//                            .replaceAll("<P>", "").replaceAll("</P>", "")
+//                            .split(",");
+//                    String answer = "";
+//                    for (int a = 0; a < answers.length; a++) {
+//                        char c1 = (char) (Integer.valueOf(answers[a]) + 64);
+//                        if (a == 0) {
+//                            answer = String.valueOf(c1);
+//                        } else {
+//                            answer = answer + "," + c1;
+//                        }
+//                    }
+//                    question.setQuesAnswer("<p>" + answer + "</p>");
+//                    question.setQuesAnswerWord(DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(question.getQuesAnswer())));
+//                }
+//                // 存在子题
+//                if (question.getQuestionType() == QuesStructType.NESTED_ANSWER_QUESTION) {
+//                    List<Question> subQuestions = new ArrayList<>();
+//                    int subQuesCount = quesTemp.getSubQues().size();
+//                    BigDecimal totalScore = BigDecimal.valueOf(question.getScore());
+//                    BigDecimal sum = BigDecimal.valueOf(subQuesCount);
+//                    double score = totalScore.divide(sum).doubleValue();
+//                    for (int s = 0; s < subQuesCount; s++) {
+//                        QuestionsTemp subQuesTmp = (QuestionsTemp) quesTemp.getSubQues().get(String.valueOf(s + 1));
+//                        Question subQuestion = new Question();
+//                        subQuestion.setId(IdUtils.uuid());
+//                        subQuestion.setQuestionType(subQuesTmp.getType());
+//                        subQuestion.setDifficulty("中");
+//                        subQuestion.setDifficultyDegree(0.5);
+//                        subQuestion.setPublicity(true);
+//                        subQuestion.setScore(score);
+//
+//                        String subBody = imgList(subQuesTmp.getBody());
+//                        question.setQuesBody(replaceBlank(body));
+//                        subQuestion.setQuesBody(subBody);
+//
+//                        subQuestion.setQuesBodyWord(DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(subQuestion.getQuesBody())));
+//                        subQuestion.setQuesAnswer(imgList(subQuesTmp.getAnswer()));
+//                        subQuestion.setQuesBodyWord(DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(subQuestion.getQuesAnswer())));
+//                        // 存在选项
+//                        if (subQuestion.getQuestionType() == QuesStructType.SINGLE_ANSWER_QUESTION
+//                                || subQuestion.getQuestionType() == QuesStructType.MULTIPLE_ANSWER_QUESTION) {
+//                            List<QuesOption> subQuesOptions = new ArrayList<QuesOption>();
+//                            Map<Object, Object> subOptionMap = subQuesTmp.getOptions();
+//                            int subOptionCount = subOptionMap.size();
+//                            for (int k = 0; k < subOptionCount; k++) {
+//                                QuesOption subQuesOption = new QuesOption();
+//                                subQuesOption.setNumber(String.valueOf(k));
+//
+//                                String optionBody = imgList((String) subOptionMap.get(String.valueOf(k + 1)));
+//                                if (optionBody.startsWith("<p><p") || optionBody.startsWith("<P><P")) {
+//                                    subQuesOption.setOptionBody(replaceFirstP(optionBody));
+//                                } else {
+//                                    subQuesOption.setOptionBody(optionBody);
+//                                }
+//
+//                                subQuesOption.setOptionBodyWord(DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(subQuesOption.getOptionBody())));
+//                                if (subQuestion.getQuesAnswer().contains(String.valueOf(k + 1))) {
+//                                    subQuesOption.setIsCorrect((short) 1);
+//                                } else {
+//                                    subQuesOption.setIsCorrect((short) 0);
+//                                }
+//                                subQuesOptions.add(subQuesOption);
+//                            }
+//                            subQuestion.setQuesOptions(subQuesOptions);
+//                            String[] answers = subQuestion.getQuesAnswer()
+//                                    .replaceAll("<p>", "").replaceAll("</p>", "")
+//                                    .replaceAll("<P>", "").replaceAll("</P>", "")
+//                                    .split(",");
+//                            String answer = "";
+//                            for (int a = 0; a < answers.length; a++) {
+//                                char c1 = (char) (Integer.valueOf(answers[a]) + 64);
+//                                if (a == 0) {
+//                                    answer = String.valueOf(c1);
+//                                } else {
+//                                    answer = answer + "," + c1;
+//                                }
+//                            }
+//                            subQuestion.setQuesAnswer(answer);
+//                            subQuestion.setQuesAnswerWord(DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml("<p>" + subQuestion.getQuesAnswer() + "</p>")));
+//                        }
+//                        subQuestions.add(subQuestion);
+//                    }
+//                    question.setSubQuestions(subQuestions);
+//                }
+//                byte[] pkgByte = DocxProcessUtil.getPkgByte(wordMLPackage);
+//                QuestionPkgPath quesPkgPath = new QuestionPkgPath(pkgByte);
+//                map.put(question, quesPkgPath);
+//                // 包装小题
+//                PaperDetailUnit paperDetailUnit = new PaperDetailUnit();
+//                paperDetailUnit.setPaper(paper);
+//                paperDetailUnit.setNumber(nm + 1);
+//                paperDetailUnit.setScore(question.getScore());
+//                paperDetailUnit.setPaperDetail(detail);
+//                paperDetailUnit.setQuestionType(question.getQuestionType());
+//                paperDetailUnit.setCreator("feng");
+//                paperDetailUnit.setCreateTime(CommonUtils.getCurDateTime());
+//                paperDetailUnit.setQuestion(question);
+//                paperDetailUnits.add(paperDetailUnit);
+//                nm++;
+//            }
+//        }
+//        return paperDetailUnits;
+//    }
 
     public String imgList(String str) throws Exception {
         if (StringUtils.isBlank(str)) {

+ 57 - 0
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/util/DocxTemplateBean.java

@@ -0,0 +1,57 @@
+package cn.com.qmth.examcloud.core.questions.service.util;
+
+import freemarker.template.Template;
+
+public class DocxTemplateBean {
+
+    private String key;
+
+    private String docxPath;
+
+    private Template contentTypes;
+
+    private Template document;
+
+    private Template documentRels;
+
+    public String getKey() {
+        return key;
+    }
+
+    public void setKey(String key) {
+        this.key = key;
+    }
+
+    public Template getContentTypes() {
+        return contentTypes;
+    }
+
+    public void setContentTypes(Template contentTypes) {
+        this.contentTypes = contentTypes;
+    }
+
+    public Template getDocument() {
+        return document;
+    }
+
+    public void setDocument(Template document) {
+        this.document = document;
+    }
+
+    public Template getDocumentRels() {
+        return documentRels;
+    }
+
+    public void setDocumentRels(Template documentRels) {
+        this.documentRels = documentRels;
+    }
+
+    public String getDocxPath() {
+        return docxPath;
+    }
+
+    public void setDocxPath(String docxPath) {
+        this.docxPath = docxPath;
+    }
+
+}

+ 723 - 0
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/util/ExportPaperUtil.java

@@ -0,0 +1,723 @@
+package cn.com.qmth.examcloud.core.questions.service.util;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang.StringEscapeUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+import org.jsoup.nodes.Node;
+import org.jsoup.nodes.TextNode;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import cn.com.qmth.examcloud.commons.exception.ExamCloudRuntimeException;
+import cn.com.qmth.examcloud.core.questions.base.FileDisposeUtil;
+import cn.com.qmth.examcloud.core.questions.base.dto.ExportTempDataDto;
+import cn.com.qmth.examcloud.core.questions.base.enums.ExamFileType;
+import cn.com.qmth.examcloud.core.questions.base.enums.ExportTemplateType;
+import cn.com.qmth.examcloud.core.questions.base.json.JOption;
+import cn.com.qmth.examcloud.core.questions.base.json.JOptionDto;
+import cn.com.qmth.examcloud.core.questions.base.json.JSection;
+import cn.com.qmth.examcloud.core.questions.base.json.JsonImportUtil;
+import cn.com.qmth.examcloud.core.questions.base.json.SectionElement;
+import cn.com.qmth.examcloud.core.questions.base.json.SectionElementParams;
+import cn.com.qmth.examcloud.core.questions.base.question.enums.QuesStructType;
+import cn.com.qmth.examcloud.core.questions.dao.entity.QuesOption;
+import cn.com.qmth.examcloud.core.questions.dao.entity.Question;
+import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperDetailExp;
+import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperDetailUnitExp;
+import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperExp;
+import freemarker.template.Configuration;
+import freemarker.template.Template;
+import sun.misc.BASE64Decoder;
+
+public class ExportPaperUtil {
+
+    private static final Logger log = LoggerFactory.getLogger(ExportPaperUtil.class);
+    
+    private static final int docImageSzie=12700;
+
+    private static final String DOCX_SUFFIX = ".docx";
+
+    private static final String ZIP_SUFFIX = ".zip";
+
+    public static final String QUESOPS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+
+    public static final String ELEMENT_TYPE_RID = "imageId";
+
+    public static final String ELEMENT_TYPE_TEXT = "text";
+
+    public static final String ELEMENT_TYPE_IMG = "image";
+
+    private static final String ENCODING = "UTF-8";
+
+    private static Configuration config;
+
+    private static Template docSection;
+    
+    private static Template examReamarkDocument;
+
+    private static Template questionSection;
+
+    private static Template paperQuesOps;
+
+    private static Template contentTypes;
+
+    private static Template document;
+
+    private static Template documentRel;
+
+    private static Pattern heightRex = Pattern.compile("height:([\\s\\S]*?)px");
+
+    private static Pattern widthRex = Pattern.compile("width:([\\s\\S]*?)px");
+    static {
+
+        config = new Configuration(Configuration.VERSION_2_3_25);
+        // 设置编码
+        config.setDefaultEncoding(ENCODING);
+        // 设置ftl模板路径
+        config.setClassForTemplateLoading(JsonImportUtil.class, "/export_template/origin_paper/");
+
+        try {
+            questionSection = config.getTemplate("question_section.ftl", ENCODING);
+            contentTypes = config.getTemplate("content_types.ftl", ENCODING);
+            document = config.getTemplate("document.ftl", ENCODING);
+            documentRel = config.getTemplate("document_rel.ftl", ENCODING);
+            paperQuesOps = config.getTemplate("question_options.ftl", ENCODING);
+            docSection=config.getTemplate("doc_section.ftl", ENCODING);
+            examReamarkDocument=config.getTemplate("exam_reamark_document.ftl", ENCODING);
+        } catch (IOException e) {
+            log.error(e.getMessage(), e);
+        }
+    }
+    //考试说明word文件
+    public static File createExamRemarkDocFile(File directory,String fileName,String html) throws IOException {
+     // doc固定源文件目录
+        File docxDir = new File(getDocxBasePath());
+        // 将要生成的doc源文件目录
+        File docxTargetDir = new File(directory.getAbsolutePath() + "/docx/");
+        docxTargetDir.mkdir();
+        // 复制docx基础文件
+        FileUtils.copyDirectory(docxDir, docxTargetDir);
+        // 处理并生成doc源文件
+        disposeExamRemark(docxTargetDir, html);
+        // 压缩docx源文件
+        File zipfile = new File(
+                docxTargetDir.getParentFile().getAbsolutePath() + File.separator + fileName + ZIP_SUFFIX);
+        FileDisposeUtil.createZip(docxTargetDir.getAbsolutePath(), zipfile.getAbsolutePath());
+        File docfile = new File(
+                docxTargetDir.getParentFile().getAbsolutePath() + File.separator + fileName + DOCX_SUFFIX);
+        // 修改压缩包为doc文件
+        zipfile.renameTo(docfile);
+        FileUtils.deleteDirectory(docxTargetDir);
+        return docfile;
+    }
+    private static void disposeExamRemark(File docxTargetDir, String html) throws IOException {
+        ExportTempDataDto dto = new ExportTempDataDto();
+        List<JSection> slist=null;
+        if (StringUtils.isNotBlank(html)) {
+            slist = getSections(html);
+            if (slist != null && slist.size() > 0) {
+                htmlToDoc(slist, dto);
+            }
+        }
+        // content-type
+        writeContentType(docxTargetDir, dto);
+        // document
+        writeExamRemarkDocument(docxTargetDir, slist);
+        // document-rel
+        writeDocumentRel(docxTargetDir, dto);
+        // image file
+        writeImage(docxTargetDir, dto);
+    }
+    private static void writeExamRemarkDocument(File docxTargetDir, List<JSection> slist) throws IOException {
+        StringWriter result = null;
+        try {
+            result = new StringWriter();
+            Map<String, Object> map = new HashMap<String, Object>();
+            map.put("sections", slist);
+            examReamarkDocument.process(map, result);
+        } catch (Exception e) {
+            throw new ExamCloudRuntimeException(e);
+        }
+        File file = new File(docxTargetDir.getAbsolutePath() + "/word/document.xml");
+        FileUtils.writeStringToFile(file, result.toString(), "utf-8");
+    }
+    // 考试试卷
+    public static File createPaperDocFile(Long rootOrgId, PaperExp paperExp, File directory, String paperfileName,
+            ExportTemplateType templateType) throws Exception {
+        DocxTemplateBean docxTemplate = ExportTemplateUtil.getDocxTemplateBean(rootOrgId, templateType);
+        // doc固定源文件目录
+        File docxDir = new File(docxTemplate.getDocxPath());
+        // 将要生成的doc源文件目录
+        File docxTargetDir = new File(directory.getAbsolutePath() + File.separator + "docx" + File.separator);
+        docxTargetDir.mkdir();
+        // 复制docx基础文件
+        FileUtils.copyDirectory(docxDir, docxTargetDir);
+        // 处理并生成doc源文件
+        disposePaperDoc(docxTargetDir, paperExp, docxTemplate);
+        // 压缩docx源文件
+        File zipfile = new File(docxTargetDir.getParentFile().getAbsolutePath() + File.separator
+                + paperfileName.substring(0, paperfileName.lastIndexOf(".")) + ZIP_SUFFIX);
+        FileDisposeUtil.createZip(docxTargetDir.getAbsolutePath(), zipfile.getAbsolutePath());
+        File docfile = new File(docxTargetDir.getParentFile().getAbsolutePath() + File.separator + paperfileName);
+        // 修改压缩包为doc文件
+        zipfile.renameTo(docfile);
+        FileUtils.deleteDirectory(docxTargetDir);
+        return docfile;
+
+    }
+
+    private static void disposePaperDoc(File docxTargetDir, PaperExp paperExp, DocxTemplateBean docxTemplate)
+            throws IOException {
+        ExportTempDataDto dto = new ExportTempDataDto();
+        disposePaperExamRemark(paperExp, dto);
+        if (paperExp.getPaperDetails() != null && paperExp.getPaperDetails().size() > 0) {
+            for (PaperDetailExp pde : paperExp.getPaperDetails()) {
+                dto.setSubNum(0);
+                dto.setAnswerNum(0);
+                if (pde.getPaperDetailUnits() != null && pde.getPaperDetailUnits().size() > 0) {
+                    for (PaperDetailUnitExp pdue : pde.getPaperDetailUnits()) {
+                        Question qes = pdue.getQuestion();
+                        disposePaperQuestion(qes, dto);
+                    }
+                }
+            }
+        }
+        // content-type
+        writePaperContentType(docxTargetDir, dto, docxTemplate);
+        // document
+        writePaperDocument(docxTargetDir, paperExp, docxTemplate);
+        // document-rel
+        writePaperDocumentRel(docxTargetDir, dto, docxTemplate);
+        // image file
+        writeImage(docxTargetDir, dto);
+    }
+
+    private static void writePaperDocument(File docxTargetDir, PaperExp paperExp, DocxTemplateBean docxTemplate)
+            throws IOException {
+        String doc = getPaperDocumentDoc(paperExp, docxTemplate);
+        File file = new File(docxTargetDir.getAbsolutePath() + "/word/document.xml");
+        FileUtils.writeStringToFile(file, doc, "utf-8");
+    }
+
+    private static String getPaperDocumentDoc(Object paperExp, DocxTemplateBean docxTemplate) {
+        StringWriter result = null;
+        try {
+            result = new StringWriter();
+            docxTemplate.getDocument().process(paperExp, result);
+            return result.toString();
+        } catch (Exception e) {
+            throw new ExamCloudRuntimeException(e);
+        }
+    }
+
+    private static void writePaperContentType(File docxTargetDir, ExportTempDataDto dto, DocxTemplateBean docxTemplate)
+            throws IOException {
+        Map<String, Object> map = new HashMap<String, Object>();
+        map.put("images", dto.getTypes());
+        String doc = getPaperContentTypesDoc(map, docxTemplate);
+        File file = new File(docxTargetDir.getAbsolutePath() + "/[Content_Types].xml");
+        FileUtils.writeStringToFile(file, doc, "utf-8");
+    }
+
+    private static String getPaperContentTypesDoc(Map<String, Object> map, DocxTemplateBean docxTemplate) {
+        StringWriter result = null;
+        try {
+            result = new StringWriter();
+            docxTemplate.getContentTypes().process(map, result);
+            return result.toString();
+        } catch (Exception e) {
+            throw new ExamCloudRuntimeException(e);
+        }
+    }
+
+    private static void writePaperDocumentRel(File docxTargetDir, ExportTempDataDto dto, DocxTemplateBean docxTemplate)
+            throws IOException {
+        Map<String, Object> map = new HashMap<String, Object>();
+        map.put("images", dto.getImages());
+        String doc = getPaperDocumentRelDoc(map, docxTemplate);
+        File file = new File(docxTargetDir.getAbsolutePath() + "/word/_rels/document.xml.rels");
+        FileUtils.writeStringToFile(file, doc, "utf-8");
+    }
+
+    private static String getPaperDocumentRelDoc(Map<String, Object> map, DocxTemplateBean docxTemplate) {
+        StringWriter result = null;
+        try {
+            result = new StringWriter();
+            docxTemplate.getDocumentRels().process(map, result);
+            return result.toString();
+        } catch (Exception e) {
+            throw new ExamCloudRuntimeException(e);
+        }
+    }
+
+    // 原始试卷
+    public static File createOriginPaperDocFile(PaperExp paperExp, File directory) throws Exception {
+        // doc固定源文件目录
+        File docxDir = new File(getDocxBasePath());
+        // 将要生成的doc源文件目录
+        File docxTargetDir = new File(directory.getAbsolutePath() + "/docx/");
+        docxTargetDir.mkdir();
+        // 复制docx基础文件
+        FileUtils.copyDirectory(docxDir, docxTargetDir);
+        // 处理并生成doc源文件
+        dispose(docxTargetDir, paperExp);
+        // 压缩docx源文件
+        String paperfileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_" + ExamFileType.PAPER.getName();
+        File zipfile = new File(
+                docxTargetDir.getParentFile().getAbsolutePath() + File.separator + paperfileName + ZIP_SUFFIX);
+        FileDisposeUtil.createZip(docxTargetDir.getAbsolutePath(), zipfile.getAbsolutePath());
+        File docfile = new File(
+                docxTargetDir.getParentFile().getAbsolutePath() + File.separator + paperfileName + DOCX_SUFFIX);
+        // 修改压缩包为doc文件
+        zipfile.renameTo(docfile);
+        FileUtils.deleteDirectory(docxTargetDir);
+        return docfile;
+
+    }
+
+    private static String getDocxBasePath() {
+        return JsonImportUtil.class.getProtectionDomain().getCodeSource().getLocation().getPath()
+                + "export_template/docx";
+    }
+
+    private static List<JSection> getSections(String html) {
+        return getSections(html, false);
+    }
+
+    private static List<JSection> getSections(String html, boolean diposeFillBlank) {
+        if (StringUtils.isBlank(html)) {
+            return null;
+        }
+        html = html.trim();
+        if (!html.startsWith("<p>")) {
+            html = "<p>" + html + "</p>";
+        }
+        List<JSection> ss = new ArrayList<JSection>();
+        Document doc = Jsoup.parse(html);
+        Element b = doc.body();
+        for (Node e : b.childNodes()) {
+            if ("p".equals(e.nodeName()) && e.childNodeSize() > 0) {
+                JSection s = new JSection();
+                List<SectionElement> ses = new ArrayList<SectionElement>();
+                s.setElements(ses);
+                for (Node ce : e.childNodes()) {
+                    getSectionElement(ce, ses, diposeFillBlank);
+                }
+                ss.add(s);
+            }
+        }
+        return ss;
+
+    }
+
+    private static void getSectionElement(Node ce, List<SectionElement> ses, boolean diposeFillBlank) {
+        if ("span".equals(ce.nodeName()) && ce.childNodeSize() > 0) {
+            for (Node e : ce.childNodes()) {
+                getSectionElement(e, ses, diposeFillBlank);
+            }
+        } else {
+            SectionElement se = new SectionElement();
+            if (ce instanceof TextNode) {
+                TextNode tn = (TextNode) ce;
+                se.setType(ELEMENT_TYPE_TEXT);
+                String text = tn.text();
+                if (diposeFillBlank) {
+                    text = text.replaceAll("###", "______").replaceAll("##", "______");
+                }
+                text = text.replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll("\u0000", " ");
+                se.setValue(text);
+            } else if (ce instanceof Element) {
+                if ("img".equals(ce.nodeName())) {
+                    se.setType(ELEMENT_TYPE_IMG);
+                    se.setValue(ce.attr("src"));
+                    SectionElementParams sep = se.getParams();
+                    sep.setHeight(getHeight(ce));
+                    sep.setWidth(getWidth(ce));
+                } else {
+                    Element el = (Element) ce;
+                    se.setType(ELEMENT_TYPE_TEXT);
+                    se.setValue(el.text());
+                }
+            }
+            ses.add(se);
+        }
+    }
+
+    private static int getWidth(Node ce) {
+        int n = 50;
+        String str = ce.attr("width");
+        if (StringUtils.isNoneBlank(str)) {
+            return getWordImgSize(str);
+        }
+        String style = ce.attr("style");
+        if (StringUtils.isNoneBlank(style)) {
+            Matcher m = widthRex.matcher(style);
+            if (m.find()) {
+                return Integer.valueOf(m.group(1)) * docImageSzie;
+            }
+        }
+        return n;
+    }
+
+    private static int getHeight(Node ce) {
+        int n = 50;
+        String str = ce.attr("height");
+        if (StringUtils.isNoneBlank(str)) {
+            return getWordImgSize(str);
+        }
+        String style = ce.attr("style");
+        if (StringUtils.isNoneBlank(style)) {
+            Matcher m = heightRex.matcher(style);
+            if (m.find()) {
+                return Integer.valueOf(m.group(1)) * docImageSzie;
+            }
+        }
+        return n;
+    }
+
+    private static Integer getWordImgSize(String px) {
+        if (StringUtils.isBlank(px)) {
+            return null;
+        }
+        String sizeStr = px.replace("px", "");
+        Integer size = Integer.valueOf(sizeStr) * docImageSzie;
+        return size;
+    }
+
+    private static void dispose(File docxTargetDir, PaperExp paperExp) throws IOException {
+        ExportTempDataDto dto = new ExportTempDataDto();
+        if (paperExp.getPaperDetails() != null && paperExp.getPaperDetails().size() > 0) {
+            for (PaperDetailExp pde : paperExp.getPaperDetails()) {
+                dto.setMainNum(dto.getMainNum() + 1);
+                dto.setSubNum(0);
+                if (pde.getPaperDetailUnits() != null && pde.getPaperDetailUnits().size() > 0) {
+                    for (PaperDetailUnitExp pdue : pde.getPaperDetailUnits()) {
+                        Question qes = pdue.getQuestion();
+                        disposeQuestion(qes, dto);
+                    }
+                }
+            }
+        }
+        // content-type
+        writeContentType(docxTargetDir, dto);
+        // document
+        writeDocument(docxTargetDir, paperExp);
+        // document-rel
+        writeDocumentRel(docxTargetDir, dto);
+        // image file
+        writeImage(docxTargetDir, dto);
+    }
+
+    private static void writeImage(File docxTargetDir, ExportTempDataDto dto) throws IOException {
+        for (SectionElement se : dto.getImages()) {
+            File file = new File(docxTargetDir.getAbsolutePath() + "/word/media/image" + se.getParams().getIndex() + "."
+                    + se.getParams().getType());
+            String base64 = se.getValue();
+            if (base64.contains("data:image")) {
+                base64 = base64.substring(base64.indexOf(",") + 1);
+            }
+            BASE64Decoder decoder = new BASE64Decoder();
+            byte[] bytes = decoder.decodeBuffer(base64);
+            FileUtils.writeByteArrayToFile(file, bytes);
+        }
+    }
+
+    private static void writeDocumentRel(File docxTargetDir, ExportTempDataDto dto) throws IOException {
+        Map<String, Object> map = new HashMap<String, Object>();
+        map.put("images", dto.getImages());
+        StringWriter result = null;
+        try {
+            result = new StringWriter();
+            documentRel.process(map, result);
+        } catch (Exception e) {
+            throw new ExamCloudRuntimeException(e);
+        }
+        File file = new File(docxTargetDir.getAbsolutePath() + "/word/_rels/document.xml.rels");
+        FileUtils.writeStringToFile(file, result.toString(), "utf-8");
+    }
+
+    private static void writeContentType(File docxTargetDir, ExportTempDataDto dto) throws IOException {
+        Map<String, Object> map = new HashMap<String, Object>();
+        map.put("images", dto.getTypes());
+        StringWriter result = null;
+        try {
+            result = new StringWriter();
+            contentTypes.process(map, result);
+        } catch (Exception e) {
+            throw new ExamCloudRuntimeException(e);
+        }
+        File file = new File(docxTargetDir.getAbsolutePath() + "/[Content_Types].xml");
+        FileUtils.writeStringToFile(file, result.toString(), "utf-8");
+    }
+
+    private static void writeDocument(File docxTargetDir, PaperExp paperExp) throws IOException {
+        StringWriter result = null;
+        try {
+            result = new StringWriter();
+            document.process(paperExp, result);
+        } catch (Exception e) {
+            throw new ExamCloudRuntimeException(e);
+        }
+        File file = new File(docxTargetDir.getAbsolutePath() + "/word/document.xml");
+        FileUtils.writeStringToFile(file, result.toString(), "utf-8");
+    }
+
+    private static void disposeQuestion(Question qes, ExportTempDataDto dto) {
+        if (qes != null) {
+            List<JSection> slist1 = getSections(qes.getQuesBody(),
+                    QuesStructType.FILL_BLANK_QUESTION.equals(qes.getQuestionType()));
+            if (slist1 != null && slist1.size() > 0) {
+                if (qes.getSubQuestions() == null || qes.getSubQuestions().size() == 0) {// 套题题干不加题号
+                    dto.setSubNum(dto.getSubNum() + 1);
+                    SectionElement se = new SectionElement();
+                    se.setType(ELEMENT_TYPE_TEXT);
+                    se.setValue(dto.getSubNum() + ".");
+                    slist1.get(0).getElements().add(0, se);
+                }
+
+                htmlToDoc(slist1, dto);
+                qes.setQuesBodyWord(getQuestionDoc(slist1));
+            }
+
+            if (qes.getQuesOptions() != null && qes.getQuesOptions().size() > 0) {
+                int index = 0;
+                for (QuesOption qo : qes.getQuesOptions()) {
+                    List<JSection> slist2 = getSections(qo.getOptionBody());
+                    if (slist2 != null && slist2.size() > 0) {
+                        SectionElement se = new SectionElement();
+                        se.setType(ELEMENT_TYPE_TEXT);
+                        se.setValue(QUESOPS.charAt(index) + ".");
+                        index++;
+                        slist2.get(0).getElements().add(0, se);
+                        htmlToDoc(slist2, dto);
+                        qo.setOptionBodyWord(getQuestionDoc(slist2));
+                    }
+
+                }
+            }
+            List<JSection> slist3 = getSections(qes.getQuesAnswer());
+            if (slist3 != null && slist3.size() > 0) {
+                SectionElement se = new SectionElement();
+                se.setType(ELEMENT_TYPE_TEXT);
+                se.setValue("[答案]:");
+                slist3.get(0).getElements().add(0, se);
+
+                htmlToDoc(slist3, dto);
+                qes.setQuesAnswerWord(getQuestionDoc(slist3));
+            }
+
+            if (qes.getSubQuestions() != null && qes.getSubQuestions().size() > 0) {
+                dto.setSubNum(0);
+                for (Question sunqes : qes.getSubQuestions()) {
+                    disposeQuestion(sunqes, dto);// 递归处理套题
+                }
+            }
+        }
+    }
+
+    private static void disposePaperExamRemark(PaperExp paperExp, ExportTempDataDto dto) {
+        if (StringUtils.isNotBlank(paperExp.getExamRemark())) {
+            List<JSection> slist = getSections(paperExp.getExamRemark());
+            if (slist != null && slist.size() > 0) {
+                htmlToDoc(slist, dto);
+                paperExp.setExamRemarkWord(getSectionDoc(slist));
+            }
+        }
+        if(paperExp.getExamRemarkWord()==null) {
+            paperExp.setExamRemarkWord("");
+        }
+    }
+
+    private static void disposePaperQuestion(Question qes, ExportTempDataDto dto) {
+        if (qes != null) {
+            if (qes.getSubQuestions() == null || qes.getSubQuestions().size() == 0) {// 套题题干不加题号
+                dto.setSubNum(dto.getSubNum() + 1);
+            }
+            List<JSection> slist1 = getSections(qes.getQuesBody(),true);
+            if (slist1 != null && slist1.size() > 0) {
+                if (qes.getSubQuestions() == null || qes.getSubQuestions().size() == 0) {// 套题题干不加题号
+                    SectionElement se = new SectionElement();
+                    se.setType(ELEMENT_TYPE_TEXT);
+                    se.setValue(dto.getSubNum() + ".");
+                    slist1.get(0).getElements().add(0, se);
+                }
+
+                htmlToDoc(slist1, dto);
+                qes.setQuesBodyWord(getQuestionDoc(slist1));
+            }
+
+            if (qes.getQuesOptions() != null && qes.getQuesOptions().size() > 0) {
+                int index = 0;
+                JOptionDto joDto = new JOptionDto();
+                List<JOption> ops = new ArrayList<JOption>();
+                joDto.setOptions(ops);
+                for (QuesOption qo : qes.getQuesOptions()) {
+                    List<JSection> slist2 = getSections(qo.getOptionBody());
+                    if (slist2 != null && slist2.size() > 0) {
+                        SectionElement se = new SectionElement();
+                        se.setType(ELEMENT_TYPE_TEXT);
+                        se.setValue(QUESOPS.charAt(index) + ".");
+                        index++;
+                        slist2.get(0).getElements().add(0, se);
+                        htmlToDoc(slist2, dto);
+                        JOption jo = new JOption();
+                        jo.setJsections(slist2);
+                        ops.add(jo);
+                    }
+                }
+                disposeQuesOptions(joDto);// 处理选项列数
+                qes.setQuesOptionsWord(getPaperQuestionDoc(joDto.getOptions()));
+            }
+            if (qes.getSubQuestions() == null || qes.getSubQuestions().size() == 0) {// 套题不加答案序号
+                dto.setAnswerNum(dto.getAnswerNum() + 1);
+            }
+            List<JSection> slist3 = getSections(qes.getQuesAnswer());
+            if (slist3 != null && slist3.size() > 0) {
+                SectionElement se = new SectionElement();
+                se.setType(ELEMENT_TYPE_TEXT);
+                se.setValue(dto.getAnswerNum() + ".");
+                slist3.get(0).getElements().add(0, se);
+
+                htmlToDoc(slist3, dto);
+                qes.setQuesAnswerWord(getQuestionDoc(slist3));
+            }
+
+            if (qes.getSubQuestions() != null && qes.getSubQuestions().size() > 0) {
+                dto.setSubNum(0);
+                dto.setAnswerNum(0);
+                for (Question sunqes : qes.getSubQuestions()) {
+                    disposePaperQuestion(sunqes, dto);// 递归处理套题
+                }
+            }
+        }
+    }
+
+    private static void disposeQuesOptions(JOptionDto joDto) {
+        for (JOption jo : joDto.getOptions()) {
+            if (jo.getJsections().size() > 1) {
+                return;
+            }
+            for (JSection js : jo.getJsections()) {
+                for (SectionElement se : js.getElements()) {
+                    if (ELEMENT_TYPE_IMG.equals(se.getType())) {
+                        return;
+                    }
+                }
+            }
+        }
+        int columns = 4;
+        for (JOption jo : joDto.getOptions()) {
+            JSection js = jo.getJsections().get(0);
+            for (SectionElement se : js.getElements()) {
+                String text = StringEscapeUtils.unescapeXml(se.getValue());
+                if (text.length() > 20) {
+                    return;
+                } else if (text.length() > 9) {
+                    columns = 2;
+                }
+            }
+
+        }
+        formatList(joDto, columns);
+    }
+
+    private static void formatList(JOptionDto joDto, int size) {
+        List<JOption> ret = new ArrayList<JOption>();
+        int count = 0;
+        for (int i = 0; i < joDto.getOptions().size(); i++) {
+            if (count == 0) {
+                JOption jo = new JOption();
+                jo.setCols(size);
+                List<JSection> temlist = new ArrayList<JSection>();
+                jo.setJsections(temlist);
+                JSection js = new JSection();
+                List<SectionElement> ses = new ArrayList<SectionElement>();
+                js.setElements(ses);
+                temlist.add(js);
+                ret.add(jo);
+            }
+            if (count != 0) {
+                joDto.getOptions().get(i).getJsections().get(0).getElements().get(0).getParams().setTab(true);
+            }
+            for (SectionElement se : joDto.getOptions().get(i).getJsections().get(0).getElements()) {
+                ret.get(ret.size() - 1).getJsections().get(0).getElements().add(se);
+            }
+            count++;
+            if (count == size) {
+                count = 0;
+            }
+        }
+        joDto.setOptions(ret);
+    }
+
+    private static void htmlToDoc(List<JSection> slist, ExportTempDataDto dto) {
+        for (JSection js : slist) {
+            for (SectionElement se : js.getElements()) {
+                if (ELEMENT_TYPE_IMG.equals(se.getType())) {
+                    dto.setIndex(dto.getIndex() + 1);
+                    se.getParams().setIndex(dto.getIndex());
+                    se.getParams().setRid(ELEMENT_TYPE_RID + dto.getIndex());
+                    se.getParams().setType(getImageType(se.getValue()));
+                    dto.getTypes().add(se.getParams().getType());
+                    dto.getImages().add(se);
+                }
+            }
+        }
+    }
+
+    private static String getImageType(String base64) {
+        return base64.substring(11, base64.indexOf(";"));
+    }
+    private static String getSectionDoc(List<JSection> sections) {
+        Map<String, Object> map = new HashMap<String, Object>();
+        map.put("sections", sections);
+        StringWriter result = null;
+        try {
+            result = new StringWriter();
+            docSection.process(map, result);
+            return result.toString();
+        } catch (Exception e) {
+            throw new ExamCloudRuntimeException(e);
+        }
+    }
+
+    private static String getQuestionDoc(List<JSection> sections) {
+        Map<String, Object> map = new HashMap<String, Object>();
+        map.put("sections", sections);
+        StringWriter result = null;
+        try {
+            result = new StringWriter();
+            questionSection.process(map, result);
+            return result.toString();
+        } catch (Exception e) {
+            throw new ExamCloudRuntimeException(e);
+        }
+    }
+
+    private static String getPaperQuestionDoc(List<JOption> options) {
+        Map<String, Object> map = new HashMap<String, Object>();
+        map.put("options", options);
+        StringWriter result = null;
+        try {
+            result = new StringWriter();
+            paperQuesOps.process(map, result);
+            return result.toString();
+        } catch (Exception e) {
+            throw new ExamCloudRuntimeException(e);
+        }
+    }
+
+}

+ 92 - 0
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/util/ExportTemplateUtil.java

@@ -0,0 +1,92 @@
+package cn.com.qmth.examcloud.core.questions.service.util;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import cn.com.qmth.examcloud.commons.exception.StatusException;
+import cn.com.qmth.examcloud.core.questions.base.SpringContextUtils;
+import cn.com.qmth.examcloud.core.questions.base.enums.ExportTemplateType;
+import cn.com.qmth.examcloud.core.questions.service.ExportTemplateService;
+import cn.com.qmth.examcloud.web.config.SystemProperties;
+import freemarker.template.Configuration;
+import freemarker.template.Template;
+
+public class ExportTemplateUtil {
+
+    private static final String ENCODING = "UTF-8";
+    private static SystemProperties systemProperties= (SystemProperties)SpringContextUtils.getBeanByClass(SystemProperties.class);
+    private static ExportTemplateService exportTemplateService = SpringContextUtils.getBean(ExportTemplateService.class,
+            "exportTemplateService");
+
+    private final static Map<Long, Configuration> configs = new ConcurrentHashMap<Long, Configuration>();
+
+    private final static Map<String, Template> templates = new ConcurrentHashMap<String, Template>();
+
+    private final static Map<String, DocxTemplateBean> doctemplates = new ConcurrentHashMap<String, DocxTemplateBean>();
+
+    public static DocxTemplateBean getDocxTemplateBean(Long rootOrgId, ExportTemplateType type) {
+        String key = rootOrgId + "_" + type.getCode();
+        DocxTemplateBean temp = doctemplates.get(key);
+        File dir = exportTemplateService.getExportTemplateDirectory(type, rootOrgId);
+        if (temp == null || !temp.getKey().equals(dir.getName())||!dir.exists()) {
+            temp = createDocxTemplateBean(dir);
+            doctemplates.put(key, temp);
+        }
+        return temp;
+    }
+
+    private static DocxTemplateBean createDocxTemplateBean(File dir) {
+        DocxTemplateBean bean = new DocxTemplateBean();
+        bean.setKey(dir.getName());
+        Configuration config = new Configuration(Configuration.VERSION_2_3_25);
+        // 设置编码
+        config.setDefaultEncoding(ENCODING);
+        // 设置ftl模板路径
+        try {
+            config.setDirectoryForTemplateLoading(dir);
+            bean.setDocxPath(dir.getAbsolutePath()+File.separator+"data"+File.separator);
+            bean.setContentTypes(config.getTemplate("content_types.ftl", ENCODING));
+            bean.setDocument(config.getTemplate("document.ftl", ENCODING));
+            bean.setDocumentRels(config.getTemplate("document_rels.ftl", ENCODING));
+        } catch (IOException e) {
+            throw new StatusException("20001", "模板配置初始化出错 " + e.getMessage());
+        }
+        return bean;
+    }
+
+    public static Template getTemplate(Long rootOrgId, ExportTemplateType type) {
+        String key = rootOrgId + "_" + type.getCode();
+        Template temp = templates.get(key);
+        String tname = exportTemplateService.getExportTemplateName(type, rootOrgId);
+        if (temp == null || !temp.getName().equals(tname)) {
+            try {
+                temp = getConfig(rootOrgId).getTemplate(tname, ENCODING);
+                templates.put(key, temp);
+            } catch (IOException e) {
+                throw new StatusException("10001", "获取模板出错 " + e.getMessage());
+            }
+        }
+        return temp;
+    }
+
+    private static Configuration getConfig(Long rootOrgId) {
+        Configuration config = configs.get(rootOrgId);
+        if (config == null) {
+            config = new Configuration(Configuration.VERSION_2_3_25);
+            // 设置编码
+            config.setDefaultEncoding(ENCODING);
+            // 设置ftl模板路径
+            String temPath = systemProperties.getTempDataDir();
+            File dir = new File(temPath + File.separator + rootOrgId + File.separator);
+            try {
+                config.setDirectoryForTemplateLoading(dir);
+                configs.put(rootOrgId, config);
+            } catch (IOException e) {
+                throw new StatusException("20001", "模板配置初始化出错 " + e.getMessage());
+            }
+        }
+        return config;
+    }
+}

Some files were not shown because too many files changed in this diff