宋悦 пре 8 година
родитељ
комит
8d5cd3b57e
32 измењених фајлова са 729 додато и 210 уклоњено
  1. 2 0
      cqb-base/src/main/java/com/qmth/cqb/base/dao/CourseRepo.java
  2. 14 0
      cqb-base/src/main/java/com/qmth/cqb/base/dao/SettingRepo.java
  3. 18 0
      cqb-base/src/main/java/com/qmth/cqb/base/dto/SettingDto.java
  4. 69 0
      cqb-base/src/main/java/com/qmth/cqb/base/model/Setting.java
  5. 45 0
      cqb-base/src/main/java/com/qmth/cqb/base/service/SettingService.java
  6. 12 0
      cqb-base/src/main/java/com/qmth/cqb/base/web/CourseController.java
  7. 71 0
      cqb-base/src/main/java/com/qmth/cqb/base/web/SettingController.java
  8. 42 0
      cqb-comm-utils/src/main/java/com/qmth/cqb/utils/enums/Switch.java
  9. 0 34
      cqb-comm-utils/src/main/java/com/qmth/cqb/utils/modal/NormalResponse.java
  10. 0 63
      cqb-comm-utils/src/main/java/com/qmth/cqb/utils/modal/PagingAndSortingResponse.java
  11. 18 33
      cqb-comm-utils/src/main/java/com/qmth/cqb/utils/word/DocxProcessUtil.java
  12. 2 2
      cqb-comm-utils/src/main/resources/paper_template.ftl
  13. 3 0
      cqb-gen-paper/src/main/java/com/qmth/cqb/genpaper/service/GenPaperService.java
  14. 4 4
      cqb-gen-paper/src/main/java/com/qmth/cqb/genpaper/web/GenPaperController.java
  15. 16 1
      cqb-paper/src/main/java/com/qmth/cqb/paper/dto/PaperDetailExp.java
  16. 10 0
      cqb-paper/src/main/java/com/qmth/cqb/paper/model/Paper.java
  17. 24 0
      cqb-paper/src/main/java/com/qmth/cqb/paper/model/PaperDetailStruct.java
  18. 21 2
      cqb-paper/src/main/java/com/qmth/cqb/paper/model/PaperDetailUnitStruct.java
  19. 45 0
      cqb-paper/src/main/java/com/qmth/cqb/paper/model/PaperStructSearchInfo.java
  20. 58 0
      cqb-paper/src/main/java/com/qmth/cqb/paper/service/ExportPaperService.java
  21. 17 8
      cqb-paper/src/main/java/com/qmth/cqb/paper/service/ImportPaperService.java
  22. 44 1
      cqb-paper/src/main/java/com/qmth/cqb/paper/service/PaperService.java
  23. 33 20
      cqb-paper/src/main/java/com/qmth/cqb/paper/service/PaperStructService.java
  24. 33 0
      cqb-paper/src/main/java/com/qmth/cqb/paper/web/ExportPaperController.java
  25. 9 2
      cqb-paper/src/main/java/com/qmth/cqb/paper/web/PaperController.java
  26. 52 22
      cqb-paper/src/main/java/com/qmth/cqb/paper/web/PaperStructController.java
  27. 6 1
      cqb-question-resource/src/main/java/com/qmth/cqb/question/model/Question.java
  28. 29 6
      cqb-question-resource/src/main/java/com/qmth/cqb/question/service/QuesService.java
  29. 2 8
      cqb-question-resource/src/main/java/com/qmth/cqb/question/web/QuesController.java
  30. 27 0
      cqb-starter/src/main/java/com/qmth/cqb/initData.java
  31. 2 2
      cqb-starter/src/main/resources/application-dev.properties
  32. 1 1
      cqb-starter/src/test/java/com/qmth/cqb/AppTest.java

+ 2 - 0
cqb-base/src/main/java/com/qmth/cqb/base/dao/CourseRepo.java

@@ -12,5 +12,7 @@ import org.springframework.data.repository.query.QueryByExampleExecutor;
  */
 public interface CourseRepo extends MongoRepository<Course, String>,QueryByExampleExecutor<Course> {
     List<Course> findByCourseNameLike(String courseName);
+
+    Course findByCourseNo(String courseNo);
     
 }

+ 14 - 0
cqb-base/src/main/java/com/qmth/cqb/base/dao/SettingRepo.java

@@ -0,0 +1,14 @@
+package com.qmth.cqb.base.dao;
+
+import com.qmth.cqb.base.model.Course;
+import com.qmth.cqb.base.model.Setting;
+import org.springframework.data.mongodb.repository.MongoRepository;
+import org.springframework.data.repository.query.QueryByExampleExecutor;
+
+import java.util.List;
+
+/**
+ * Created by songyue on 16/12/26.
+ */
+public interface SettingRepo extends MongoRepository<Setting, String>,QueryByExampleExecutor<Setting> {
+}

+ 18 - 0
cqb-base/src/main/java/com/qmth/cqb/base/dto/SettingDto.java

@@ -0,0 +1,18 @@
+package com.qmth.cqb.base.dto;
+
+import com.qmth.cqb.base.model.Setting;
+import java.util.List;
+/**
+ * Created by songyue on 17/3/27.
+ */
+public class SettingDto {
+    private List<Setting> settingList;
+
+    public List<Setting> getSettingList() {
+        return settingList;
+    }
+
+    public void setSettingList(List<Setting> settingList) {
+        this.settingList = settingList;
+    }
+}

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

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

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

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

+ 12 - 0
cqb-base/src/main/java/com/qmth/cqb/base/web/CourseController.java

@@ -90,4 +90,16 @@ public class CourseController {
                 HttpStatus.OK);
     }
 
+    /**
+     * 根据课程编号获取课程信息
+     * @param courseNo
+     * @return
+     */
+    @ApiOperation(value="根据课程编号获取课程信息",notes="根据课程编号获取课程信息")
+    @GetMapping(value = "/course/{courseNo}")
+    public ResponseEntity getCourseByNo(@PathVariable String courseNo){
+        return new ResponseEntity(courseRepo.findByCourseNo(courseNo),
+                HttpStatus.OK);
+    }
+
 }

+ 71 - 0
cqb-base/src/main/java/com/qmth/cqb/base/web/SettingController.java

@@ -0,0 +1,71 @@
+package com.qmth.cqb.base.web;
+
+import com.google.gson.Gson;
+import com.qmth.cqb.base.dao.SettingRepo;
+import com.qmth.cqb.base.dto.SettingDto;
+import com.qmth.cqb.base.model.Setting;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * Created by songyue on 16/12/26.
+ */
+
+@RestController
+@RequestMapping("${api_cqb}/")
+public class SettingController {
+
+    @Autowired
+    Gson gson;
+    
+    @Autowired
+    SettingRepo settingRepo;
+
+    /**
+     * 获取全部设置
+     * @return
+     */
+    @ApiOperation(value="获取全部设置",notes="获取全部设置")
+    @GetMapping(value = "/setting")
+    public ResponseEntity getAllSetting(){
+        return new ResponseEntity(settingRepo.findAll(), HttpStatus.OK);
+    }
+
+    /**
+     * 更新设置
+     * @param settingDto
+     * @return
+     */
+    @ApiOperation(value="更新设置",notes="更新设置")
+    @PutMapping(value = "/setting")
+    public ResponseEntity updateSetting(@RequestBody SettingDto settingDto){
+    	return new ResponseEntity(settingRepo.save(settingDto.getSettingList()),HttpStatus.OK);
+    }
+
+    /**
+     * 新增设置
+     * @param settingDto
+     * @return
+     */
+    @ApiOperation(value="新增设置",notes="新增设置")
+    @PostMapping(value = "/setting")
+    public ResponseEntity addSetting(@RequestBody SettingDto settingDto){
+    	return new ResponseEntity(settingRepo.save(settingDto.getSettingList()),HttpStatus.OK);
+    }
+
+    /**
+     * 删除设置
+     * @param id
+     * @return
+     */
+    @ApiOperation(value="删除设置",notes="删除设置")
+    @DeleteMapping(value = "/setting/{id}")
+    public ResponseEntity removeSetting(@PathVariable String id){
+        settingRepo.delete(id);
+    	return new ResponseEntity(HttpStatus.OK);
+    }
+
+}

+ 42 - 0
cqb-comm-utils/src/main/java/com/qmth/cqb/utils/enums/Switch.java

@@ -0,0 +1,42 @@
+package com.qmth.cqb.utils.enums;
+
+/**
+ * Created by songyue on 17/3/27.
+ */
+public enum Switch {
+
+    ON(1L,"开启"),
+    OFF(2L,"关闭");
+
+    private Long id;
+    private String name;
+
+    private Switch(Long id, String name) {
+        this.id = id;
+        this.name = name;;
+    }
+
+    private Switch(){
+
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String toString(){
+        return getName();
+    }
+}

+ 0 - 34
cqb-comm-utils/src/main/java/com/qmth/cqb/utils/modal/NormalResponse.java

@@ -1,34 +0,0 @@
-package com.qmth.cqb.utils.modal;
-
-/**
- * 普通操作响应类
- * Created by songyue on 16/12/27.
- */
-public class NormalResponse {
-    private String httpStatus;//http状态字
-    private String Message;//返回信息
-
-    public String getHttpStatus() {
-        return httpStatus;
-    }
-
-    public void setHttpStatus(String httpStatus) {
-        this.httpStatus = httpStatus;
-    }
-
-    public String getMessage() {
-        return Message;
-    }
-
-    public void setMessage(String message) {
-        Message = message;
-    }
-
-    public NormalResponse(String httpStatus, String message) {
-        this.httpStatus = httpStatus;
-        Message = message;
-    }
-
-    public NormalResponse() {
-    }
-}

+ 0 - 63
cqb-comm-utils/src/main/java/com/qmth/cqb/utils/modal/PagingAndSortingResponse.java

@@ -1,63 +0,0 @@
-package com.qmth.cqb.utils.modal;
-
-import java.util.List;
-
-/**
- * 查询分页相应类
- * Created by songyue on 16/12/27.
- */
-public class PagingAndSortingResponse<T>{
-    private int curPage;//当前页数
-    private int pageSize;//每页数据量
-    private int totalPages;//总页数
-    private long totalElements;//总数据量
-    private List<T> dataList;//实际数据
-
-    public PagingAndSortingResponse(int curPage, int pageSize, int totalPages, long totalElements, List<T> dataList) {
-        this.curPage = curPage;
-        this.pageSize = pageSize;
-        this.totalPages = totalPages;
-        this.totalElements = totalElements;
-        this.dataList = dataList;
-    }
-
-    public int getCurPage() {
-        return curPage;
-    }
-
-    public void setCurPage(int curPage) {
-        this.curPage = curPage;
-    }
-
-    public int getPageSize() {
-        return pageSize;
-    }
-
-    public void setPageSize(int pageSize) {
-        this.pageSize = pageSize;
-    }
-
-    public int getTotalPages() {
-        return totalPages;
-    }
-
-    public void setTotalPages(int totalPages) {
-        this.totalPages = totalPages;
-    }
-
-    public long getTotalElements() {
-        return totalElements;
-    }
-
-    public void setTotalElements(long totalElements) {
-        this.totalElements = totalElements;
-    }
-
-    public List<T> getDataList() {
-        return dataList;
-    }
-
-    public void setDataList(List<T> dataList) {
-        this.dataList = dataList;
-    }
-}

+ 18 - 33
cqb-comm-utils/src/main/java/com/qmth/cqb/utils/word/DocxProcessUtil.java

@@ -19,6 +19,7 @@ import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
 
+import javax.servlet.http.HttpServletResponse;
 import javax.xml.bind.JAXBElement;
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
@@ -82,8 +83,7 @@ import net.sourceforge.jeuclid.converter.Converter;
 public final class DocxProcessUtil {
 
     public static final LayoutContext IMG_LAYOUT = new StyleAttributeLayoutContext(
-            LayoutContextImpl.getDefaultLayoutContext(), "3em", java.awt.Color.BLACK);
-
+            LayoutContextImpl.getDefaultLayoutContext(), "2em", java.awt.Color.BLACK);
     public static final String IMG_OUT_TYPE = "image/png";
 
     public static final String ENCODING = "utf-8";
@@ -129,7 +129,6 @@ public final class DocxProcessUtil {
 
     /**
      * 获取段落的所有文本
-     * 
      * @param p
      * @return
      */
@@ -145,7 +144,6 @@ public final class DocxProcessUtil {
 
     /**
      * 校验段落中是否含有公式或图片
-     * 
      * @param p
      * @return
      */
@@ -161,7 +159,6 @@ public final class DocxProcessUtil {
 
     /**
      * 获取文档包副本(去除段落)
-     * 
      * @param wordMLPackage
      * @return
      * @throws Exception
@@ -181,7 +178,6 @@ public final class DocxProcessUtil {
 
     /**
      * 初始化文档包(去除所有段落)
-     * 
      * @param wordMLPackage
      * @return
      * @throws Exception
@@ -194,7 +190,6 @@ public final class DocxProcessUtil {
 
     /**
      * 获得段落wordml
-     * 
      * @param p
      * @return
      */
@@ -204,7 +199,6 @@ public final class DocxProcessUtil {
 
     /**
      * 转换wordMl为html
-     * 
      * @param wordMl
      * @return
      * @throws Exception
@@ -244,7 +238,6 @@ public final class DocxProcessUtil {
 
     /**
      * 替换所有公式为图片
-     * 
      * @param wordMLPackage
      * @throws Exception
      */
@@ -274,7 +267,6 @@ public final class DocxProcessUtil {
 
     /**
      * 替换公式为图片
-     * 
      * @param p
      * @throws Exception
      */
@@ -300,7 +292,6 @@ public final class DocxProcessUtil {
 
     /**
      * 创建新图片
-     * 
      * @param wordMLPackage
      * @param bytes
      * @param filenameHint
@@ -330,7 +321,6 @@ public final class DocxProcessUtil {
 
     /**
      * 获取wordMl固定节点下所有子节点
-     * 
      * @param obj
      * @param toSearch
      * @return
@@ -353,7 +343,6 @@ public final class DocxProcessUtil {
 
     /**
      * omml转换成mml
-     * 
      * @param omml
      * @return
      */
@@ -388,7 +377,6 @@ public final class DocxProcessUtil {
 
     /**
      * 格式化转换后的html(html字符串)
-     * 
      * @param htmlStr
      * @return
      */
@@ -417,7 +405,7 @@ public final class DocxProcessUtil {
 
     /**
      * 获取html(html字符串)里面文本
-     * 
+     *
      * @param htmlStr
      * @return
      */
@@ -438,7 +426,6 @@ public final class DocxProcessUtil {
 
     /**
      * 格式化转换后的html(html临时文件)
-     * 
      * @param htmlPath
      * @return
      */
@@ -478,7 +465,6 @@ public final class DocxProcessUtil {
 
     /**
      * 转换mathml为png图片
-     * 
      * @param mathMlStr
      * @return
      */
@@ -507,7 +493,6 @@ public final class DocxProcessUtil {
 
     /**
      * 通过图片路径获取base64码
-     * 
      * @param imgFilePath
      * @return
      */
@@ -531,7 +516,6 @@ public final class DocxProcessUtil {
 
     /**
      * 通过图片文件获取base64码
-     * 
      * @param imgFile
      * @return
      */
@@ -553,7 +537,6 @@ public final class DocxProcessUtil {
 
     /**
      * 格式化段落wordml
-     * 
      * @param pWordMl
      * @return
      * @throws Exception
@@ -573,7 +556,6 @@ public final class DocxProcessUtil {
 
     /**
      * 过滤试题单元标题
-     * 
      * @param p
      * @param quesUnit
      * @return
@@ -598,7 +580,7 @@ public final class DocxProcessUtil {
                         String tmpText = text.getValue();
                         if (quesUnit == QuesUnit.QUES_BODY) {
                             // 过滤题干标题
-                            if (tmpText.matches("^\\d{1,}\\.[\\s\\S]*")) {
+                            if (tmpText.matches("^\\d{1,}\\.")) {
                                 tmpText = tmpText.replaceFirst("\\d{1,}\\.", "");
                                 text.setValue(tmpText);
                             } else {
@@ -610,11 +592,11 @@ public final class DocxProcessUtil {
 
                         } else if (quesUnit == QuesUnit.QUES_OPTION) {
                             // 过滤选项标题
-                            if (tmpText.matches("^[a-zA-Z]\\.[\\s\\S]*")) {
-                                tmpText = tmpText.replaceFirst("[a-zA-Z]\\.", "");
+                            if (tmpText.matches("^[A-Z]\\.")) {
+                                tmpText = tmpText.replaceFirst("[A-Z]\\.", "");
                                 text.setValue(tmpText);
                             } else {
-                                tmpText = tmpText.replaceFirst("[a-zA-Z]", "").replaceFirst("\\.", "");
+                                tmpText = tmpText.replaceFirst("[A-Z]", "").replaceFirst("\\.", "");
                                 text.setValue(tmpText);
                                 if (index == 2)
                                     break;
@@ -641,7 +623,6 @@ public final class DocxProcessUtil {
 
     /**
      * 导出word
-     * 
      * @param dataMap
      * @param fileName
      */
@@ -675,7 +656,6 @@ public final class DocxProcessUtil {
 
     /**
      * 导出试卷
-     * 
      * @param dataMap
      * @param fileName
      */
@@ -685,7 +665,6 @@ public final class DocxProcessUtil {
 
     /**
      * 导出答案
-     * 
      * @param dataMap
      * @param fileName
      */
@@ -695,7 +674,6 @@ public final class DocxProcessUtil {
 
     /**
      * 处理导出word中的图片
-     * 
      * @param fileName
      * @param wordMLPackages
      * @throws Exception
@@ -735,7 +713,6 @@ public final class DocxProcessUtil {
 
     /**
      * 获取word二进制数据(空文档,只有样式和资源)
-     * 
      * @param wordMLPackage
      * @return
      * @throws Exception
@@ -755,7 +732,6 @@ public final class DocxProcessUtil {
 
     /**
      * 通过二进制流获取word文档包
-     * 
      * @param bytes
      * @return
      */
@@ -774,7 +750,6 @@ public final class DocxProcessUtil {
 
     /**
      * 初始化word文档图片资源路径,防止导出试卷时资源ID冲突
-     * 
      * @param wordMLPackage
      */
     public static void initPkgImage(WordprocessingMLPackage wordMLPackage) {
@@ -806,11 +781,21 @@ public final class DocxProcessUtil {
 
     /**
      * 获取RldNum
-     * 
      * @return
      */
     public static String getRldNum() {
         return REL_ID_HEADER + CommonUtils.getCurNum();
     }
 
+    public static void processDownload(String fileName,HttpServletResponse response) throws Exception {
+        String filePath = TEMP_FILE_EXP + fileName + DOCX_SUFFIX;
+        InputStream inputStream = new FileInputStream(filePath);
+        OutputStream outputStream = response.getOutputStream();
+        // 设置强制下载不打开
+        response.setContentType("application/octet-stream;charset=utf-8");
+        // 设置文件名
+        response.addHeader("Content-Disposition", "attachment;fileName=" + new String(fileName.getBytes("UTF-8"),"iso-8859-1") + DOCX_SUFFIX);
+        IOUtils.copyLarge(inputStream,outputStream);
+    }
+
 }

+ 2 - 2
cqb-comm-utils/src/main/resources/paper_template.ftl

@@ -63,7 +63,7 @@
                                 <w:sz w:val="44"/>
                                 <w:szCs w:val="44"/>
                             </w:rPr>
-                            <w:t>${paper.params.courseName}</w:t>
+                            <w:t>${paper.courseName}</w:t>
                         </w:r>
                         <w:r w:rsidR="00097880" w:rsidRPr="00FD0974">
                             <w:rPr>
@@ -100,7 +100,7 @@
                                 <w:sz w:val="28"/>
                                 <w:szCs w:val="28"/>
                             </w:rPr>
-                            <w:t>${paper.params.courseNo}</w:t>
+                            <w:t>${paper.courseNo}</w:t>
                         </w:r>
                         <w:r w:rsidRPr="007E01D1">
                             <w:rPr>

+ 3 - 0
cqb-gen-paper/src/main/java/com/qmth/cqb/genpaper/service/GenPaperService.java

@@ -9,6 +9,7 @@ import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
 
+import com.qmth.cqb.utils.enums.PaperType;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -96,6 +97,7 @@ public class GenPaperService {
         Set<Question> quesSet = paperContext.getSelectQues();
         if (quesSet.size() < unitContexts.size()) {
             msg = "匹配的题源不足,请核查";
+            paperMsgMap.put("msg", msg);
             return paperMsgMap;
         }
         List<PaperDetail> paperDetails = new ArrayList<PaperDetail>();
@@ -276,6 +278,7 @@ public class GenPaperService {
             paper.setCreateTime(CommonUtils.getCurDateTime());
             paper.setPaperDetailCount(details.size());
             paper.setTotalScore(score);
+            paper.setPaperType(PaperType.GENERATE);
         }
         return paper;
 

+ 4 - 4
cqb-gen-paper/src/main/java/com/qmth/cqb/genpaper/web/GenPaperController.java

@@ -36,9 +36,9 @@ public class GenPaperController {
             paperMap = genPaperService.genPaperByScore(genPaperDto);
         }
         if (paperMap.get("msg").equals("success")) {
-            return new ResponseEntity(paperMap.get("paper"), HttpStatus.OK);
+            return new ResponseEntity(paperMap, HttpStatus.OK);
         } else {
-            return new ResponseEntity(paperMap.get("msg"), HttpStatus.INTERNAL_SERVER_ERROR);
+            return new ResponseEntity(paperMap, HttpStatus.INTERNAL_SERVER_ERROR);
         }
 
     }
@@ -48,9 +48,9 @@ public class GenPaperController {
     public ResponseEntity genPaperNormal(@RequestBody GenPaperDto genPaperDto) {
         Map<String, Object> paperMap = genPaperService.genPaper(genPaperDto);
         if (paperMap.get("msg").equals("success")) {
-            return new ResponseEntity(paperMap.get("paper"), HttpStatus.OK);
+            return new ResponseEntity(paperMap, HttpStatus.OK);
         } else {
-            return new ResponseEntity(paperMap.get("msg"), HttpStatus.INTERNAL_SERVER_ERROR);
+            return new ResponseEntity(paperMap, HttpStatus.INTERNAL_SERVER_ERROR);
         }
     }
 

+ 16 - 1
cqb-paper/src/main/java/com/qmth/cqb/paper/dto/PaperDetailExp.java

@@ -8,7 +8,7 @@ import java.util.*;
  * 试卷大题导出dto
  * Created by songyue on 17/3/15.
  */
-public class PaperDetailExp implements Serializable {
+public class PaperDetailExp implements Serializable,Comparable<PaperDetailExp>{
     private static final long serialVersionUID = -3520871668728091404L;
 
     private String id;
@@ -84,5 +84,20 @@ public class PaperDetailExp implements Serializable {
     public void setPaperDetailUnits(List<PaperDetailUnitExp> paperDetailUnits) {
         this.paperDetailUnits = paperDetailUnits;
     }
+
+
+    @Override
+    public int compareTo(PaperDetailExp paperDetailExp) {
+        if (paperDetailExp != null) {
+            if (this.getNumber() > paperDetailExp.getNumber()) {
+                return 1;
+            } else if (this.getNumber() < paperDetailExp.getNumber()) {
+                return -1;
+            }else{
+                return 0;
+            }
+        }
+        return -1;
+    }
 }
 

+ 10 - 0
cqb-paper/src/main/java/com/qmth/cqb/paper/model/Paper.java

@@ -31,6 +31,8 @@ public class Paper implements Serializable {
 
     private Integer paperDetailCount;//大题数量
 
+    private Integer unitCount;//小题数量
+
     private String createTime;//创建时间
 
     private String lastModifyName;//最后修改人名称
@@ -173,6 +175,14 @@ public class Paper implements Serializable {
         this.courseName = courseName;
     }
 
+    public Integer getUnitCount() {
+        return unitCount;
+    }
+
+    public void setUnitCount(Integer unitCount) {
+        this.unitCount = unitCount;
+    }
+
     public Paper() {
 		this.createTime = CommonUtils.getCurDateTime();
     }

+ 24 - 0
cqb-paper/src/main/java/com/qmth/cqb/paper/model/PaperDetailStruct.java

@@ -25,6 +25,10 @@ public class PaperDetailStruct implements Serializable{
 	
 	private Map params;//大题参数
 
+	private String remark;
+
+	private Integer detailCount;
+
 	public String getId() {
 		return id;
 	}
@@ -73,6 +77,26 @@ public class PaperDetailStruct implements Serializable{
 		this.params = params;
 	}
 
+	public static long getSerialVersionUID() {
+		return serialVersionUID;
+	}
+
+	public String getRemark() {
+		return remark;
+	}
+
+	public void setRemark(String remark) {
+		this.remark = remark;
+	}
+
+	public Integer getDetailCount() {
+		return detailCount;
+	}
+
+	public void setDetailCount(Integer detailCount) {
+		this.detailCount = detailCount;
+	}
+
 	public PaperDetailStruct() {
 	}
 }

+ 21 - 2
cqb-paper/src/main/java/com/qmth/cqb/paper/model/PaperDetailUnitStruct.java

@@ -13,9 +13,13 @@ public class PaperDetailUnitStruct implements Serializable {
 
     private String id;
 
-    private Double score;// 小题分数
+    private Integer count;
 
-    private QuesStructType questionType;// 小题类型
+    private Double score;//小题分数
+
+    private Double totalScore;
+
+    private QuesStructType questionType;//小题类型
 
     public static long getSerialVersionUID() {
         return serialVersionUID;
@@ -45,4 +49,19 @@ public class PaperDetailUnitStruct implements Serializable {
         this.questionType = questionType;
     }
 
+    public Integer getCount() {
+        return count;
+    }
+
+    public void setCount(Integer count) {
+        this.count = count;
+    }
+
+    public Double getTotalScore() {
+        return totalScore;
+    }
+
+    public void setTotalScore(Double totalScore) {
+        this.totalScore = totalScore;
+    }
 }

+ 45 - 0
cqb-paper/src/main/java/com/qmth/cqb/paper/model/PaperStructSearchInfo.java

@@ -0,0 +1,45 @@
+package com.qmth.cqb.paper.model;
+
+import java.io.Serializable;
+
+/**
+ * Created by songyue on 17/3/27.
+ */
+public class PaperStructSearchInfo implements Serializable{
+
+    private static final long serialVersionUID = 5282899855557734214L;
+
+    private String name;
+
+    private String creator;
+
+    private String createtime;
+
+    public static long getSerialVersionUID() {
+        return serialVersionUID;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getCreator() {
+        return creator;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+
+    public String getCreatetime() {
+        return createtime;
+    }
+
+    public void setCreatetime(String createtime) {
+        this.createtime = createtime;
+    }
+}

+ 58 - 0
cqb-paper/src/main/java/com/qmth/cqb/paper/service/ExportPaperService.java

@@ -11,6 +11,7 @@ import com.qmth.cqb.paper.model.Paper;
 import com.qmth.cqb.paper.model.PaperDetail;
 import com.qmth.cqb.paper.model.PaperDetailUnit;
 import com.qmth.cqb.question.dao.QuesRepo;
+import com.qmth.cqb.question.model.QuesOption;
 import com.qmth.cqb.question.model.Question;
 import com.qmth.cqb.utils.BeanCopierUtil;
 import com.qmth.cqb.utils.CommonUtils;
@@ -22,6 +23,8 @@ import org.docx4j.wml.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import javax.servlet.http.HttpServletResponse;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -105,6 +108,27 @@ public class ExportPaperService {
         return "success";
     }
 
+    /**
+     * 下载试卷
+     * @param id
+     */
+    public Map downloadPaper(String id, HttpServletResponse response){
+        Map dataMap = null;
+        try {
+            dataMap = initExportPaper(id);
+            if(dataMap.get("errorInfo")!=null){
+                return dataMap;
+            }
+            String fileName = (String)dataMap.get("fileName");
+            DocxProcessUtil.exportPaper(dataMap,fileName);
+            DocxProcessUtil.processImage(fileName,getPkgList(id));
+            DocxProcessUtil.processDownload(fileName,response);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return dataMap;
+    }
+
     /**
      * 初始化序号
      * @param paperExp
@@ -115,6 +139,7 @@ public class ExportPaperService {
         }
         int mainNum = 0;
         int subNum = 0;
+        Collections.sort(paperExp.getPaperDetails());
         for(PaperDetailExp paperDetail: paperExp.getPaperDetails()){
             //大题序号
             paperDetail.setCnNum(CommonUtils.toCHNum(paperDetail.getNumber()));
@@ -125,11 +150,23 @@ public class ExportPaperService {
             }
             //小题序号
             for(PaperDetailUnitExp paperDetailUnit:paperDetail.getPaperDetailUnits()){
+                List<QuesOption> optionList = paperDetailUnit.getQuestion().getQuesOptions();
+                if(optionList != null && optionList.size() > 0){
+                    for(QuesOption quesOption:optionList){
+                        quesOption.setOptionBodyWord(setOptionNum(quesOption.getOptionBodyWord(),quesOption.getNumber()));
+                    }
+                }
                 List<Question> subQuesList = paperDetailUnit.getQuestion().getSubQuestions();
                 //套题序号
                 if(subQuesList != null && subQuesList.size() > 0){
                     for(Question subQues:subQuesList){
                         subQues.setQuesBodyWord(setSubQuesNum(subQues.getQuesBodyWord(),++subNum));
+                        List<QuesOption> subOptionList = subQues.getQuesOptions();
+                        if(subOptionList != null && subOptionList.size() > 0){
+                            for(QuesOption quesOption:subOptionList){
+                                quesOption.setOptionBodyWord(setOptionNum(quesOption.getOptionBodyWord(),quesOption.getNumber()));
+                            }
+                        }
                     }
                 }else{
                     Question question = paperDetailUnit.getQuestion();
@@ -173,5 +210,26 @@ public class ExportPaperService {
         return DocxProcessUtil.formatPWordMl(XmlUtils.marshaltoString(p));
     }
 
+    /**
+     * 设置选项号
+     * @param optionWordMl
+     * @param num
+     * @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);
+        P p = (P)body.getContent().get(0);
+        List<Object> pContent = p.getContent();
+        R run = new R();
+        Text text = new Text();
+        text.setValue(num+". ");
+        run.getContent().add(text);
+        pContent.add(0,run);
+        return DocxProcessUtil.formatPWordMl(XmlUtils.marshaltoString(p));
+    }
+
 
 }

+ 17 - 8
cqb-paper/src/main/java/com/qmth/cqb/paper/service/ImportPaperService.java

@@ -7,6 +7,7 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.IOUtils;
@@ -108,11 +109,13 @@ public class ImportPaperService {
     public void savePaper(Paper paper, List paperDetails, List paperDetailUnits, List questions,
             ImportPaperCheck importPaperCheck) {
 
+        Paper tempPaper = null;
+
         if (!StringUtils.isEmpty(importPaperCheck.errorInfo))
             return;
 
         if (paper != null) {
-            paperRepo.save(paper);
+            tempPaper = paperRepo.save(paper);
         }
 
         if (paperDetails.size() > 0) {
@@ -127,6 +130,7 @@ public class ImportPaperService {
             paperDetailUnitRepo.save(paperDetailUnits);
         }
 
+        paperService.formatPaper(tempPaper);
     }
 
     /**
@@ -247,7 +251,6 @@ public class ImportPaperService {
                 }
             }
             paper.setPaperDetailCount(mainQuesNum);
-            paper.setTotalScore((double) 100);
             // 保存导入试卷信息
             savePaper(paper, paperDetails, paperDetailUnits, questions, importPaperCheck);
 
@@ -317,6 +320,7 @@ public class ImportPaperService {
             Question question, int subQuesNum, ImportPaperCheck importPaperCheck) {
 
         question.setQuestionType(getQuesStructType(importPaperCheck.quesType));
+        question.setScore(Double.parseDouble(importPaperCheck.quesScore));
         paperDetailUnit.setNumber(++subQuesNum);
         paperDetailUnit.setQuestion(question);
         paperDetailUnit.setPaperDetail(paperDetail);
@@ -478,7 +482,8 @@ public class ImportPaperService {
             if (StringUtils.isEmpty(tmpText)) {
                 continue;
             } else if (tmpText.matches("^[a-zA-Z]\\.[\\s\\S]*")) {// 判断是否为选项
-
+                // 过滤选项标题
+                pOption = DocxProcessUtil.formatP(pOption, QuesUnit.QUES_OPTION);
                 quesOptionWordMl = DocxProcessUtil.getPWordMl(pOption);
                 quesOptionHtml = DocxProcessUtil.docx2Html(quesOptionWordMl, wordMLPackage);
                 // 创建试题选项
@@ -547,12 +552,12 @@ public class ImportPaperService {
             importPaperCheck.setErrorInfo(getQuesNumInfo(importPaperCheck.quesName, subQuesNum) + "答案为空或格式不正确\n");
         }
 
-        // 设置小题分数
-        quesParams.put("小题分数", quesScore);
-        question.setQuesParams(quesParams);
-
+        // 设置预设分数
+        if(StringUtils.isNumeric(quesScore)){
+            question.setScore(Double.parseDouble(quesScore));
+        }
         // 一般大题明细需要设置分数
-        if (!isNested && !StringUtils.isEmpty(quesScore)) {
+        if (!isNested && StringUtils.isNumeric(quesScore)) {
             paperDetailUnit.setScore(Double.parseDouble(quesScore));
         }
     }
@@ -604,6 +609,10 @@ public class ImportPaperService {
                 }
 
                 Question subQues = new Question();
+                subQues.setQuestionType(getQuesStructType(nestedQuesType));
+                if(StringUtils.isNumeric(importPaperCheck.getQuesScore())){
+                    subQues.setScore(Double.parseDouble(importPaperCheck.getQuesScore()));
+                }
 
                 // 处理客观题
                 if (nestedQuesType.equals("单选") || nestedQuesType.equals("多选")) {

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

@@ -4,6 +4,7 @@ import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import cn.com.qmth.examcloud.common.dto.question.enums.QuesStructType;
 import com.google.gson.Gson;
 import com.qmth.cqb.paper.dao.PaperDetailRepo;
 import com.qmth.cqb.paper.dao.PaperDetailUnitRepo;
@@ -86,6 +87,7 @@ public class PaperService {
      */
 	public Paper savePaper(PaperExp paperExp){
 		Paper paper = BeanCopierUtil.copyProperties(paperExp,Paper.class);
+		formatPaper(paper);
 		return paperRepo.save(paper);
 	}
 
@@ -274,6 +276,7 @@ public class PaperService {
 		}
 		int mainNum = 0;
 		int subNum = 0;
+		Collections.sort(paperExp.getPaperDetails());
 		for(PaperDetailExp paperDetail: paperExp.getPaperDetails()){
 			//大题序号
 			paperDetail.setCnNum(CommonUtils.toCHNum(paperDetail.getNumber()));
@@ -285,7 +288,7 @@ public class PaperService {
 			//小题序号
 			for(PaperDetailUnitExp paperDetailUnit:paperDetail.getPaperDetailUnits()){
 
-				quesService.formatQues(paperDetailUnit.getQuestion());
+				quesService.formatQuesUnit(paperDetailUnit.getQuestion());
 
 				List<Question> subQuesList = paperDetailUnit.getQuestion().getSubQuestions();
 				//套题序号
@@ -294,6 +297,7 @@ public class PaperService {
 						Map<String,String> params = new HashMap<String,String>();
 						params.put("number",String.valueOf(++subNum));
 						subQues.setQuesParams(params);
+						quesService.formatQuesUnit(subQues);
 					}
 				}else{
 					paperDetailUnit.setNumber(++subNum);
@@ -322,4 +326,43 @@ public class PaperService {
 		}
 	}
 
+	/**
+	 * 填充大题小题数量与分数
+	 * @param paper
+	 */
+	public void formatPaper(Paper paper){
+		List<PaperDetail> paperDetails = paperDetailRepo.findByPaper(paper);
+		//计算试卷总分
+		List<PaperDetailUnit> paperDetailUnitAll = paperDetailUnitRepo.findByPaper(paper);
+		double totalScore = paperDetailUnitAll.stream().mapToDouble(PaperDetailUnit::getScore).sum();
+
+		//计算各大题总分
+		for(PaperDetail paperDetail:paperDetails){
+			List<PaperDetailUnit> paperDetailUnits = paperDetailUnitRepo.findByPaperDetail(paperDetail);
+			if(paperDetailUnits.size() > 0){
+				int count = 0;
+				double score = 0;
+				PaperDetailUnit firstUnit = paperDetailUnits.get(0);
+				QuesStructType questionType = firstUnit.getQuestionType();
+				if(!questionType.equals(QuesStructType.NESTED_ANSWER_QUESTION)){
+					score = paperDetailUnits.stream().map(PaperDetailUnit::getQuestion)
+							.mapToDouble(Question::getScore).sum();
+					count = paperDetailUnits.size();
+				}else{
+					Question question = firstUnit.getQuestion();
+					List<Question> subQuestions = question.getSubQuestions();
+					score = subQuestions.stream().mapToDouble(Question::getScore).sum();
+					count = subQuestions.size();
+				}
+				paperDetail.setScore(score);
+				paperDetail.setUnitCount(count);
+			}
+		}
+		paper.setUnitCount(paperDetailUnitAll.size());
+		paper.setPaperDetailCount(paperDetails.size());
+		paper.setTotalScore(totalScore);
+		paperDetailRepo.save(paperDetails);
+		paperRepo.save(paper);
+	}
+
 }

+ 33 - 20
cqb-paper/src/main/java/com/qmth/cqb/paper/service/PaperStructService.java

@@ -1,12 +1,20 @@
 package com.qmth.cqb.paper.service;
 
 
+import com.qmth.cqb.paper.model.PaperStructSearchInfo;
+import com.qmth.cqb.utils.BeanCopierUtil;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Example;
+import org.springframework.data.domain.ExampleMatcher;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
 import org.springframework.stereotype.Service;
 
 import com.qmth.cqb.paper.dao.PaperStructRepo;
 import com.qmth.cqb.paper.model.PaperStruct;
 
+import java.util.List;
 /**
  * Created by songyue on 16/12/28.
  */
@@ -15,34 +23,39 @@ public class PaperStructService {
 	
 	@Autowired
     PaperStructRepo paperStructRepo;
-	
+
 
     /**
-     * 按ID查询导入试卷
-     * @param paperId
+     * 获取所有试卷结构
+     * @param searchInfo
+     * @param curPage
+     * @param pageSize
      * @return
      */
-    public PaperStruct findById(String paperId){
-        return paperStructRepo.findOne(paperId);
+    public Page<PaperStruct> getPaperStructs(PaperStructSearchInfo searchInfo,
+                                             int curPage,
+                                             int pageSize){
+        formatSearchInfo(searchInfo);
+        PaperStruct paperStruct = BeanCopierUtil.copyProperties(searchInfo,PaperStruct.class);
+        formatPaperStruct(paperStruct);
+        ExampleMatcher matcher = ExampleMatcher.matching().
+                withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING).withIgnoreNullValues();
+        return paperStructRepo.findAll(Example.of(paperStruct,matcher),
+                new PageRequest(curPage - 1,pageSize));
     }
 
-    /**
-     * 保存试卷
-     * @param ps
-     * @return
-     */
-    public PaperStruct savePaperStructure(PaperStruct ps){
-    	PaperStruct tempPaper = paperStructRepo.save(ps);
-        return tempPaper;
+    public void formatSearchInfo(PaperStructSearchInfo searchInfo){
+        if(StringUtils.isEmpty(searchInfo.getName())){
+            searchInfo.setName(null);
+        }
+        if(StringUtils.isEmpty(searchInfo.getCreator())){
+            searchInfo.setCreator(null);
+        }
     }
 
-    /**
-     * 删除导入试卷
-     * @param paperId
-     * @return
-     */
-    public void deletePaperStructure(String paperId){
-    	paperStructRepo.delete(paperId);
+    public void formatPaperStruct(PaperStruct paperStruct){
+        paperStruct.setCreateTime(null);
     }
 
+
 }

+ 33 - 0
cqb-paper/src/main/java/com/qmth/cqb/paper/web/ExportPaperController.java

@@ -0,0 +1,33 @@
+package com.qmth.cqb.paper.web;
+
+import com.qmth.cqb.paper.service.ExportPaperService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * Created by songyue on 17/3/30.
+ */
+@Controller
+@RequestMapping("${api_cqb}/")
+public class ExportPaperController {
+
+    @Autowired
+    ExportPaperService exportPaperService;
+
+    /**
+     * 导出试卷
+     * @param id
+     * @return
+     */
+    @ApiOperation(value="导出试卷",notes="导出试卷")
+    @GetMapping(value = "/paper/export/{id}")
+    public void getPaperById(@PathVariable String id, HttpServletResponse response){
+        exportPaperService.downloadPaper(id,response);
+    }
+}

+ 9 - 2
cqb-paper/src/main/java/com/qmth/cqb/paper/web/PaperController.java

@@ -1,9 +1,11 @@
 package com.qmth.cqb.paper.web;
 
+import com.google.gson.Gson;
 import com.qmth.cqb.paper.dao.PaperRepo;
 import com.qmth.cqb.paper.dto.PaperExp;
 import com.qmth.cqb.paper.model.Paper;
 import com.qmth.cqb.paper.model.PaperSearchInfo;
+import com.qmth.cqb.paper.service.ExportPaperService;
 import com.qmth.cqb.paper.service.PaperService;
 import io.swagger.annotations.ApiOperation;
 
@@ -18,6 +20,8 @@ import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 
+import javax.servlet.http.HttpServletResponse;
+
 /**
  * Created by songyue on 16/12/28.
  */
@@ -29,7 +33,10 @@ public class PaperController {
 
     @Autowired
     PaperRepo paperRepo;
-    
+
+    @Autowired
+    Gson gson;
+
     /**
      * 根据Id获取试卷
      * @param paperId
@@ -38,7 +45,7 @@ public class PaperController {
     @ApiOperation(value="根据Id获取试卷",notes="根据Id获取试卷")
     @GetMapping(value = "/paper/{paperId}")
     public ResponseEntity getPaperById(@PathVariable String paperId){
-        return new ResponseEntity(paperService.getPaperDto(paperId),HttpStatus.OK);
+        return new ResponseEntity(gson.toJson(paperService.getPaperDto(paperId)),HttpStatus.OK);
     }
 
     /**

+ 52 - 22
cqb-paper/src/main/java/com/qmth/cqb/paper/web/PaperStructController.java

@@ -1,21 +1,21 @@
 package com.qmth.cqb.paper.web;
 
+import com.qmth.cqb.paper.dao.PaperStructRepo;
+import com.qmth.cqb.paper.model.PaperStructSearchInfo;
+import com.qmth.cqb.utils.CommonUtils;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.ModelAttribute;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import com.qmth.cqb.paper.model.PaperStruct;
 import com.qmth.cqb.paper.service.PaperStructService;
 
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
 /**
  * Created by songyue on 16/12/28.
  */
@@ -25,6 +25,34 @@ public class PaperStructController {
 	
 	@Autowired
     PaperStructService paperStructService;
+
+    @Autowired
+    PaperStructRepo paperStructRepo;
+
+    /**
+     * 获取所有试卷结构
+     * @param
+     * @return
+     */
+    @ApiOperation(value="获取试卷结构带分页",notes="获取试卷结构带分页")
+    @GetMapping(value = "/paperStruct/{curPage}/{pageSize}")
+    public ResponseEntity getPaperStructs(@ModelAttribute PaperStructSearchInfo searchInfo,
+                                                @PathVariable int curPage,
+                                                @PathVariable int pageSize){
+        return new ResponseEntity(paperStructService.getPaperStructs(searchInfo,curPage,pageSize),
+                HttpStatus.OK);
+    }
+
+    /**
+     * 获取所有试卷结构
+     * @param
+     * @return
+     */
+    @ApiOperation(value="获取试卷结构",notes="获取试卷结构")
+    @GetMapping(value = "/paperStruct")
+    public ResponseEntity findAll(){
+        return new ResponseEntity(paperStructRepo.findAll(), HttpStatus.OK);
+    }
 	
     /**
      * 根据id获取试卷结构
@@ -32,9 +60,9 @@ public class PaperStructController {
      * @return
      */
     @ApiOperation(value="获取试卷结构",notes="获取试卷结构")
-    @GetMapping(value = "/paperStructure/{id}")
-    public PaperStruct getPaperStructureById(@PathVariable String id){
-        return paperStructService.findById(id);
+    @GetMapping(value = "/paperStruct/{id}")
+    public ResponseEntity getPaperStructureById(@PathVariable String id){
+        return new ResponseEntity(paperStructRepo.findOne(id),HttpStatus.OK);
     }
     
 
@@ -44,11 +72,11 @@ public class PaperStructController {
      * @return
      */
     @ApiOperation(value="更新试卷结构",notes="更新试卷结构")
-    @PutMapping(value = "/paperStructure")
-    public ResponseEntity updatePaperStructure(@ModelAttribute PaperStruct ps){
-    	PaperStruct paperStruct = paperStructService.savePaperStructure(ps);
+    @PutMapping(value = "/paperStruct")
+    public ResponseEntity updatePaperStructure(@RequestBody PaperStruct ps){
+        ps.setDetailCount(ps.getPaperDetailStructs().size());
+    	PaperStruct paperStruct = paperStructRepo.save(ps);
     	return new ResponseEntity(paperStruct,HttpStatus.OK);
-    	
     }
 
     /**
@@ -57,21 +85,23 @@ public class PaperStructController {
      * @return
      */
     @ApiOperation(value="新增试卷结构",notes="新增试卷结构")
-    @PostMapping(value = "/paperStructure")
-    public ResponseEntity addPaperStructure(@ModelAttribute PaperStruct ps){
-    	PaperStruct paperStruct = paperStructService.savePaperStructure(ps);
+    @PostMapping(value = "/paperStruct")
+    public ResponseEntity addPaperStructure(@RequestBody PaperStruct ps){
+        ps.setDetailCount(ps.getPaperDetailStructs().size());
+    	PaperStruct paperStruct = paperStructRepo.save(ps);
     	return new ResponseEntity(paperStruct,HttpStatus.OK);
     }
 
     /**
      * 删除试卷结构
-     * @param id
+     * @param ids
      * @return
      */
     @ApiOperation(value="删除试卷结构",notes="删除试卷结构")
-    @DeleteMapping(value = "/paperStructure/{id}")
-    public ResponseEntity removePaperStructure(@PathVariable String id){
-    	paperStructService.deletePaperStructure(id);
+    @DeleteMapping(value = "/paperStruct/{ids}")
+    public ResponseEntity removePaperStructure(@PathVariable String ids){
+        List<String> paperList = Stream.of(ids.split(",")).collect(Collectors.toList());
+    	paperStructRepo.delete(paperStructRepo.findAll(paperList));
 		return new ResponseEntity(HttpStatus.OK);
     }
 }

+ 6 - 1
cqb-question-resource/src/main/java/com/qmth/cqb/question/model/Question.java

@@ -173,7 +173,12 @@ public class Question implements Serializable {
     }
 
     public WordprocessingMLPackage getPkgObj() {
-        return DocxProcessUtil.getPkg(this.quesPkg);
+        if(this.quesPkg != null && this.quesPkg.length > 0){
+            return DocxProcessUtil.getPkg(this.quesPkg);
+        }else{
+            return null;
+        }
+
     }
 
     public void setQuesPkg(byte[] quesPkg) {

+ 29 - 6
cqb-question-resource/src/main/java/com/qmth/cqb/question/service/QuesService.java

@@ -1,17 +1,17 @@
 package com.qmth.cqb.question.service;
 
 import com.qmth.cqb.question.dao.QuesRepo;
-import com.qmth.cqb.question.model.QuestionType;
+import com.qmth.cqb.question.model.QuesOption;
 import com.qmth.cqb.question.model.Question;
 import com.qmth.cqb.question.model.QuestionSearchCondition;
 
 import com.qmth.cqb.utils.BeanCopierUtil;
-import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Example;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageRequest;
 import org.springframework.stereotype.Service;
+import java.util.List;
 
 /**
  * Created by songyue on 16/12/28.
@@ -22,6 +22,25 @@ public class QuesService {
     @Autowired
     QuesRepo quesRepo;
 
+    /**
+     * 保存试题
+     * @param question
+     */
+    public void saveQues(Question question){
+        Question saveQues = quesRepo.findOne(question.getId());
+        saveQues.setQuesAnswer(question.getQuesAnswer());
+        saveQues.setScore(question.getScore());
+        saveQues.setQuesBody(question.getQuesBody());
+        if(question.getQuesOptions() != null && question.getQuesOptions().size() > 0){
+            List<QuesOption> quesOptions = question.getQuesOptions();
+            List<QuesOption> saveQuesOptions = saveQues.getQuesOptions();
+            for(int i = 0;i < quesOptions.size();i++){
+                saveQuesOptions.get(i).setOptionBody(quesOptions.get(i).getOptionBody());
+            }
+        }
+        quesRepo.save(saveQues);
+    }
+
     /**
      * 查询所有试题
      * @param searchCondition
@@ -53,6 +72,14 @@ public class QuesService {
      * @param question
      */
     public void formatQues(Question question){
+        formatQuesUnit(question);
+        if(question.getSubQuestions() != null && question.getSubQuestions().size() > 0){
+            question.getSubQuestions().stream().forEach(subQues->{
+                formatQuesUnit(subQues);});
+        }
+    }
+
+    public void formatQuesUnit(Question question){
         question.setQuesBodyWord(null);
         question.setQuesAnswerWord(null);
         question.setQuesAnswerAnalysisWord(null);
@@ -61,9 +88,5 @@ public class QuesService {
             question.getQuesOptions().stream().forEach(quesOption -> {
                 quesOption.setOptionBodyWord(null);});
         }
-        if(question.getSubQuestions() != null && question.getSubQuestions().size() > 0){
-            question.getSubQuestions().stream().forEach(subQues->{
-                formatQues(subQues);});
-        }
     }
 }

+ 2 - 8
cqb-question-resource/src/main/java/com/qmth/cqb/question/web/QuesController.java

@@ -1,19 +1,13 @@
 package com.qmth.cqb.question.web;
 
 import com.google.gson.Gson;
-import com.google.gson.reflect.TypeToken;
 import com.qmth.cqb.question.dao.QuesRepo;
-import com.qmth.cqb.question.model.QuesOption;
-import com.qmth.cqb.question.model.QuestionType;
 import com.qmth.cqb.question.model.Question;
 import com.qmth.cqb.question.model.QuestionSearchCondition;
 import com.qmth.cqb.question.service.QuesService;
-import com.qmth.cqb.utils.modal.NormalResponse;
-import com.qmth.cqb.utils.modal.PagingAndSortingResponse;
 
 import io.swagger.annotations.ApiOperation;
 
-import java.util.ArrayList;
 import java.util.List;
 
 import org.springframework.beans.factory.annotation.Autowired;
@@ -68,8 +62,8 @@ public class QuesController {
     @ApiOperation(value="更新试题",notes="更新试题")
     @PutMapping(value = "/question")
     public ResponseEntity updateQuestion(@RequestBody Question question){
-        return new ResponseEntity(quesRepo.save(question),HttpStatus.OK);
-    	
+        quesService.saveQues(question);
+        return new ResponseEntity(HttpStatus.OK);
     }
 
     /**

+ 27 - 0
cqb-starter/src/main/java/com/qmth/cqb/initData.java

@@ -0,0 +1,27 @@
+package com.qmth.cqb;
+
+import com.qmth.cqb.base.service.SettingService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.stereotype.Component;
+
+/**
+ * Created by songyue on 17/3/20.
+ */
+@Component
+public class initData implements CommandLineRunner {
+
+    protected static final Logger log = LoggerFactory.getLogger(initData.class);
+
+    @Autowired
+    SettingService settingService;
+
+    @Override
+    public void run(String... args) throws Exception {
+        log.info("设置初始化开始");
+        settingService.initData();
+        log.info("设置初始化完成");
+    }
+}

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

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

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

@@ -13,7 +13,7 @@ import com.qmth.cqb.question.model.QuestionType;
 import com.qmth.cqb.utils.GridFSUtil;
 import com.qmth.cqb.utils.enums.ExtractPolicy;
 import com.qmth.cqb.utils.enums.PaperType;
-import com.qmth.cqb.utils.enums.QuesStructType;
+import cn.com.qmth.examcloud.common.dto.question.enums.QuesStructType;
 
 import java.io.File;
 import java.io.FileInputStream;