ソースを参照

merge from release_v4.0.2

deason 4 年 前
コミット
5edf6cc2c7
71 ファイル変更2172 行追加4128 行削除
  1. 40 3
      examcloud-core-questions-api-provider/src/main/java/cn/com/qmth/examcloud/core/questions/api/controller/AudioTimeConfigController.java
  2. 67 0
      examcloud-core-questions-api-provider/src/main/java/cn/com/qmth/examcloud/core/questions/api/controller/CacheLoadController.java
  3. 1 1
      examcloud-core-questions-api-provider/src/main/java/cn/com/qmth/examcloud/core/questions/api/controller/DemoController.java
  4. 17 28
      examcloud-core-questions-api-provider/src/main/java/cn/com/qmth/examcloud/core/questions/api/controller/ExportPaperController.java
  5. 95 28
      examcloud-core-questions-api-provider/src/main/java/cn/com/qmth/examcloud/core/questions/api/controller/ExtractConfigController.java
  6. 34 0
      examcloud-core-questions-api-provider/src/main/java/cn/com/qmth/examcloud/core/questions/api/controller/GenPaperController.java
  7. 27 4
      examcloud-core-questions-api-provider/src/main/java/cn/com/qmth/examcloud/core/questions/api/controller/ImportPaperController.java
  8. 86 56
      examcloud-core-questions-api-provider/src/main/java/cn/com/qmth/examcloud/core/questions/api/controller/PaperController.java
  9. 12 3
      examcloud-core-questions-api-provider/src/main/java/cn/com/qmth/examcloud/core/questions/api/controller/PaperDetailController.java
  10. 5 1
      examcloud-core-questions-api-provider/src/main/java/cn/com/qmth/examcloud/core/questions/api/controller/QuesController.java
  11. 1 2
      examcloud-core-questions-base/src/main/java/cn/com/qmth/examcloud/core/questions/base/CommonUtils.java
  12. 0 224
      examcloud-core-questions-base/src/main/java/cn/com/qmth/examcloud/core/questions/base/converter/utils/JsonMapper.java
  13. 0 30
      examcloud-core-questions-base/src/main/java/cn/com/qmth/examcloud/core/questions/base/dto/ExportTempDataDto.java
  14. 32 0
      examcloud-core-questions-base/src/main/java/cn/com/qmth/examcloud/core/questions/base/enums/PaperSeqMode.java
  15. 22 0
      examcloud-core-questions-base/src/main/java/cn/com/qmth/examcloud/core/questions/base/exception/QuesNotEnoughException.java
  16. 28 0
      examcloud-core-questions-base/src/main/java/cn/com/qmth/examcloud/core/questions/base/processor/HttpMethodProcessorImpl.java
  17. 5 0
      examcloud-core-questions-dao/src/main/java/cn/com/qmth/examcloud/core/questions/dao/entity/ImportPaperMsg.java
  18. 32 0
      examcloud-core-questions-dao/src/main/java/cn/com/qmth/examcloud/core/questions/dao/entity/Paper.java
  19. 48 0
      examcloud-core-questions-dao/src/main/java/cn/com/qmth/examcloud/core/questions/dao/entity/PaperDetail.java
  20. 6 0
      examcloud-core-questions-dao/src/main/java/cn/com/qmth/examcloud/core/questions/dao/entity/PaperDetailUnit.java
  21. 16 0
      examcloud-core-questions-dao/src/main/java/cn/com/qmth/examcloud/core/questions/dao/entity/Question.java
  22. 1 1
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/ClonePaperService.java
  23. 7 5
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/ExportPaperService.java
  24. 2 1
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/ExtractConfigFileService.java
  25. 3 1
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/ExtractConfigService.java
  26. 198 228
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/ImportPaperService.java
  27. 3 1
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/PaperDetailService.java
  28. 3 3
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/PaperService.java
  29. 3 1
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/bean/context/PaperContext.java
  30. 70 0
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/bean/dto/DownloadPaperDto.java
  31. 15 4
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/bean/dto/GenPaperDto.java
  32. 37 0
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/bean/dto/PaperDetailExp.java
  33. 1 1
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/converter/PrintExamPaperService.java
  34. 0 102
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/BjhkExportPaperService.java
  35. 0 90
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/BjjtExportPaperService.java
  36. 0 102
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/BjsfExportPaperService.java
  37. 0 150
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/CqdxExportPaperService.java
  38. 0 128
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/CugbExportPaperService.java
  39. 0 102
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/DbsfExportPaperService.java
  40. 19 18
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/DzkdExportPaperService.java
  41. 77 837
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/ExportPaperAbstractService.java
  42. 0 126
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/FdsfExportPaperService.java
  43. 0 123
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/FjsfExportPaperService.java
  44. 0 91
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/HnsfExportPaperService.java
  45. 6 55
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/HzkjExportPaperService.java
  46. 11 32
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/InitPaperExpService.java
  47. 0 124
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/NkdxExportPaperService.java
  48. 0 94
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/RjgcExportPaperService.java
  49. 0 90
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/SddxExportPaperService.java
  50. 0 120
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/SxsfExportPaperService.java
  51. 19 232
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/SydxExportPaperService.java
  52. 0 110
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/TjdxExportPaperService.java
  53. 0 129
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/WheqxExportPaperService.java
  54. 0 115
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/XnjdExportPaperService.java
  55. 0 89
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/YkdxExportPaperService.java
  56. 0 102
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/ZgddbExportPaperService.java
  57. 0 103
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/ZgddwExportPaperService.java
  58. 0 86
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/xajdExportPaperService.java
  59. 44 14
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/impl/ExportPaperServiceImpl.java
  60. 5 3
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/impl/ExportThemisPaperServiceImpl.java
  61. 19 28
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/impl/ExtractConfigFileServiceImpl.java
  62. 41 1
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/impl/ExtractConfigServiceImpl.java
  63. 178 47
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/impl/GenPaperService.java
  64. 151 6
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/impl/PaperDetailServiceImpl.java
  65. 86 2
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/impl/PaperDetailUnitServiceImpl.java
  66. 134 10
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/impl/PaperServiceImpl.java
  67. 4 15
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/util/ExportPaperUtil.java
  68. 417 0
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/util/PaperUtil.java
  69. 1 1
      examcloud-core-questions-starter/src/main/java/cn/com/qmth/examcloud/core/questions/starter/CoreQuestionApp.java
  70. 23 5
      examcloud-core-questions-starter/src/main/java/cn/com/qmth/examcloud/core/questions/starter/config/ExamCloudResourceManager.java
  71. 20 20
      examcloud-core-questions-starter/src/main/java/cn/com/qmth/examcloud/core/questions/starter/config/ExamCloudWebMvcConfigurer.java

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

@@ -3,8 +3,6 @@ package cn.com.qmth.examcloud.core.questions.api.controller;
 import java.util.List;
 import java.util.Map;
 
-import javax.servlet.http.HttpServletRequest;
-
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
@@ -14,11 +12,16 @@ import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 
 import cn.com.qmth.examcloud.api.commons.security.bean.User;
+import cn.com.qmth.examcloud.core.basic.api.CourseCloudService;
+import cn.com.qmth.examcloud.core.basic.api.request.GetCourseReq;
 import cn.com.qmth.examcloud.core.questions.dao.entity.AudioTimeConfig;
 import cn.com.qmth.examcloud.core.questions.service.AudioTimeConfigService;
 import cn.com.qmth.examcloud.core.questions.service.cache.ExtractConfigPaperCache;
+import cn.com.qmth.examcloud.reports.commons.bean.AdminOperateReport;
+import cn.com.qmth.examcloud.reports.commons.util.ReportsUtil;
 import cn.com.qmth.examcloud.web.support.ControllerSupport;
 import io.swagger.annotations.ApiOperation;
 
@@ -35,6 +38,9 @@ public class AudioTimeConfigController extends ControllerSupport {
     private ExtractConfigPaperCache extractConfigPaperCache;
     @Autowired
     private AudioTimeConfigService audioTimeConfigService;
+    
+    @Autowired
+    private CourseCloudService courseCloudService;
 
     @ApiOperation(value = "根据examId查询音频设置 ", notes = "根据examId查询音频设置")
     @PostMapping(value = "/audioTimeConfig/{examId}/{courseCode}")
@@ -59,9 +65,14 @@ public class AudioTimeConfigController extends ControllerSupport {
 
     @ApiOperation(value = "新增音频播放次数", notes = "新增音频播放次数")
     @PostMapping("/addAudioTimeConfig")
-    public ResponseEntity<Object> addAudioTimeConfig(@RequestBody List<AudioTimeConfig> audioTimeConfigList, HttpServletRequest request) {
+    public ResponseEntity<Object> addAudioTimeConfig(@RequestBody List<AudioTimeConfig> audioTimeConfigList, @RequestParam String examId,@RequestParam String courseCode) {
         User user = getAccessUser();
         if (user != null) {
+        	GetCourseReq req=new GetCourseReq();
+        	req.setRootOrgId(user.getRootOrgId());
+        	req.setCode(courseCode);
+        	Long courseId=courseCloudService.getCourse(req).getCourseBean().getId();
+        	boolean hasAudioChange=hasAudioChange(audioTimeConfigList, examId, courseCode);
             audioTimeConfigService.saveAudioTimeConfig(audioTimeConfigList, user);
             //清除缓存
             for(AudioTimeConfig ep:audioTimeConfigList) {
@@ -69,10 +80,36 @@ public class AudioTimeConfigController extends ControllerSupport {
                 Object[] subkeys=new Object[]{Long.valueOf(ep.getExamId()), ep.getCourseCode(),ep.getGroupCode()};
                 extractConfigPaperCache.refresh(keys,subkeys);
             }
+            if(hasAudioChange) {
+            	ReportsUtil.report(new AdminOperateReport(user.getRootOrgId(), user.getUserId(), "调卷规则-保存音频播放次数","课程ID:"+courseId+" 考试ID:"+examId));
+            }
             return new ResponseEntity<>(HttpStatus.OK);
         }
         return new ResponseEntity<>(HttpStatus.NOT_FOUND);
     }
+    
+    private boolean hasAudioChange(List<AudioTimeConfig> audioTimeConfigs,String examId,String courseCode) {
+    	List<AudioTimeConfig> old=audioTimeConfigService.findAudioTimeConfigByExamId(examId, courseCode);
+    	if((old==null||old.size()==0)&&audioTimeConfigs != null&& audioTimeConfigs.size()!= 0) {
+    		return true;
+    	}
+    	if((audioTimeConfigs==null||audioTimeConfigs.size()==0)&&old != null&& old.size()!= 0) {
+    		return true;
+    	}
+    	if(old.size()!=audioTimeConfigs.size()) {
+    		return true;
+    	}
+    	for(int i=0;i<audioTimeConfigs.size();i++) {
+    		AudioTimeConfig nowc=audioTimeConfigs.get(i);
+    		AudioTimeConfig oldc=old.get(i);
+    		if(!nowc.getPaper().getId().equals(oldc.getPaper().getId())
+    				||!nowc.getQuestionId().equals(oldc.getQuestionId())
+    				||nowc.getPlayTime()!=oldc.getPlayTime()) {
+    			return true;
+    		}
+    	}
+    	return false;
+    }
 
     @ApiOperation(value = "清理音频播放次数设置", notes = "清理音频播放次数设置")
     @PostMapping("/deleteAudioTimeConfig/{examId}/{courseCode}")

+ 67 - 0
examcloud-core-questions-api-provider/src/main/java/cn/com/qmth/examcloud/core/questions/api/controller/CacheLoadController.java

@@ -0,0 +1,67 @@
+package cn.com.qmth.examcloud.core.questions.api.controller;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import cn.com.qmth.examcloud.core.questions.dao.entity.ExtractConfig;
+import cn.com.qmth.examcloud.core.questions.service.ExtractConfigService;
+import cn.com.qmth.examcloud.support.cache.CacheHelper;
+import cn.com.qmth.examcloud.support.cache.bean.BasePaperCacheBean;
+import cn.com.qmth.examcloud.support.cache.bean.ExtractConfigCacheBean;
+import cn.com.qmth.examcloud.support.cache.bean.ExtractConfigPaperCacheBean;
+import cn.com.qmth.examcloud.support.cache.bean.QuestionAnswerCacheBean;
+import cn.com.qmth.examcloud.support.cache.bean.QuestionCacheBean;
+import cn.com.qmth.examcloud.web.support.ControllerSupport;
+import io.swagger.annotations.ApiOperation;
+
+@RestController
+@RequestMapping("${api_cqb}/cache-load")
+public class CacheLoadController extends ControllerSupport {
+
+	@Autowired
+	private ExtractConfigService extractConfigService;
+
+	@ApiOperation(value = "获取调卷规则")
+	@PostMapping("/extract-config-list")
+	public List<ExtractConfig> getExtractConfigList(@RequestParam Long examId) {
+		return extractConfigService.findExtractConfig(examId);
+	}
+
+	@ApiOperation(value = "加载调卷规则缓存")
+	@PostMapping("/extract-config-cache")
+	public ExtractConfigCacheBean loadExtractConfig(@RequestParam Long examId, @RequestParam String courseCode) {
+		return CacheHelper.getExtractConfig(examId, courseCode);
+	}
+
+	@ApiOperation(value = "加载调卷规则试卷结构缓存")
+	@PostMapping("/extract-config-paper-cache")
+	public ExtractConfigPaperCacheBean loadExtractConfigPaper(@RequestParam Long examId,
+			@RequestParam String courseCode, @RequestParam String groupCode, @RequestParam String paperId) {
+		return CacheHelper.getExtractConfigPaper(examId, courseCode, groupCode, paperId);
+	}
+
+	@ApiOperation(value = "加载试卷结构缓存")
+	@PostMapping("/base-paper-cache")
+	public BasePaperCacheBean loadBasePaper(@RequestParam String paperId) {
+		return CacheHelper.getBasePaper(paperId);
+	}
+
+	@ApiOperation(value = "加载小题缓存")
+	@PostMapping("/question-cache")
+	public QuestionCacheBean loadQuestion(@RequestParam Long examId, @RequestParam String courseCode,
+			@RequestParam String groupCode, @RequestParam String questionId) {
+		return CacheHelper.getQuestion(examId, courseCode, groupCode, questionId);
+	}
+
+	@ApiOperation(value = "加载答案缓存")
+	@PostMapping("/question-answer-cache")
+	public QuestionAnswerCacheBean loadExtractConfig(@RequestParam String questionId) {
+		return CacheHelper.getQuestionAnswer(questionId);
+	}
+
+}

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

@@ -1,6 +1,6 @@
 package cn.com.qmth.examcloud.core.questions.api.controller;
 
-import cn.com.qmth.examcloud.core.questions.base.converter.utils.JsonMapper;
+import cn.com.qmth.examcloud.commons.util.JsonMapper;
 import cn.com.qmth.examcloud.core.questions.service.ExtractConfigProviderService;
 import cn.com.qmth.examcloud.core.questions.service.bean.extract.ExtractConfigPaper;
 import cn.com.qmth.examcloud.core.questions.service.cache.*;

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

@@ -15,11 +15,12 @@ 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 org.springframework.web.bind.annotation.RequestParam;
 
 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.enums.PaperSeqMode;
 import cn.com.qmth.examcloud.core.questions.dao.ExportServiceManageRepo;
-import cn.com.qmth.examcloud.core.questions.dao.entity.ExportServiceManage;
 import cn.com.qmth.examcloud.core.questions.service.ExportPaperService;
 import cn.com.qmth.examcloud.core.questions.service.export.SydxExportPaperService;
 import cn.com.qmth.examcloud.web.support.ControllerSupport;
@@ -50,20 +51,14 @@ public class ExportPaperController extends ControllerSupport {
      * @return
      */
     @ApiOperation(value = "导出试卷", notes = "导出试卷")
-    @GetMapping(value = "/paper/export/{id}/{exportContentList}/{orgId}/{loginName}/{examType}")
-    public void getPaperById(HttpServletRequest request, HttpServletResponse response, @PathVariable String id,
-            @PathVariable String orgId, @PathVariable String exportContentList, @PathVariable String loginName,
-            @PathVariable String examType) {
+    @GetMapping(value = "/paper/export/{id}/{exportContentList}/{examType}")
+    public void getPaperById(HttpServletRequest request, HttpServletResponse response, @PathVariable String id, @PathVariable String exportContentList,
+            @PathVariable String examType,@RequestParam PaperSeqMode seqMode) {
         log.info("导出开始");
         String psw = request.getParameter("psw");
-        ExportServiceManage esm = exportServiceManageRepo.findByOrgId(orgId);
-
-        if (esm == null) {
-            throw new StatusException("500", "尚未配置导出功能!");
-        }
         User user = getAccessUser();
-        exportPaperService.exportPaperFile(id, esm.getExportServiceName(), exportContentList, response, loginName,
-                examType, psw, user.getRootOrgId());
+        exportPaperService.exportPaperFile(id, exportContentList, response, seqMode,
+                examType, psw, user);
         log.info("导出结束");
     }
 
@@ -78,22 +73,16 @@ public class ExportPaperController extends ControllerSupport {
      * @param loginName
      */
     @ApiOperation(value = "批量导出试卷", notes = "批量导出")
-    @GetMapping(value = "/paper/batch_export/{paperIds}/{exportContentList}/{orgId}/{loginName}/{examType}")
+    @GetMapping(value = "/paper/batch_export/{paperIds}/{exportContentList}/{examType}")
     public void getPaperByIds(HttpServletRequest request, HttpServletResponse response, @PathVariable String paperIds,
-            @PathVariable String orgId, @PathVariable String exportContentList, @PathVariable String loginName,
-            @PathVariable String examType) {
+            @PathVariable String orgId, @PathVariable String exportContentList,
+            @PathVariable String examType,@RequestParam PaperSeqMode seqMode) {
         log.info("批量导出");
         List<String> paperList = Stream.of(paperIds.split(",")).collect(Collectors.toList());
-        ExportServiceManage esm = exportServiceManageRepo.findByOrgId(orgId);
-
-        if (esm == null) {
-            throw new StatusException("500", "尚未配置导出功能!");
-        }
-
         try {
             User user = getAccessUser();
-            exportPaperService.exportPaperFiles(paperList, esm.getExportServiceName(), exportContentList, response,
-                    loginName, examType, user.getRootOrgId());
+            exportPaperService.exportPaperFiles(paperList, exportContentList, response,
+            		seqMode, examType, user);
         } catch (Exception e) {
             log.error("导出异常",e);
         }
@@ -138,12 +127,12 @@ public class ExportPaperController extends ControllerSupport {
     @GetMapping(value = "/originalPaper/exportPlus/{paperId}/{loginName}")
     public void downOriginalPaperPlus(HttpServletResponse response, @PathVariable String paperId,
             @PathVariable String loginName) {
+        User user=getAccessUser();
         try {
-            User user=getAccessUser();
-            exportPaperService.downOriginalPaperPlus(paperId, user.getRootOrgId(), response);
-        } catch (Exception e) {
-            log.error(e.getMessage(), e);
-        }
+			exportPaperService.downOriginalPaperPlus(paperId, user.getRootOrgId(), response);
+		} catch (IOException e) {
+			throw new StatusException("500", e.getMessage(),e);
+		}
         log.info("开始导出原始导入的试卷");
     }
 }

+ 95 - 28
examcloud-core-questions-api-provider/src/main/java/cn/com/qmth/examcloud/core/questions/api/controller/ExtractConfigController.java

@@ -1,35 +1,46 @@
 package cn.com.qmth.examcloud.core.questions.api.controller;
 
 
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
 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.enums.ExportWay;
+import cn.com.qmth.examcloud.core.questions.base.enums.PaperSeqMode;
 import cn.com.qmth.examcloud.core.questions.base.question.PaperDto;
 import cn.com.qmth.examcloud.core.questions.base.question.QuestionDto;
+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.service.ExtractConfigFileService;
 import cn.com.qmth.examcloud.core.questions.service.ExtractConfigService;
 import cn.com.qmth.examcloud.core.questions.service.bean.CouresInfo;
 import cn.com.qmth.examcloud.core.questions.service.bean.dto.ExportPaperInfoModel;
 import cn.com.qmth.examcloud.core.questions.service.cache.ExtractConfigCache;
+import cn.com.qmth.examcloud.reports.commons.bean.AdminOperateReport;
+import cn.com.qmth.examcloud.reports.commons.util.ReportsUtil;
 import cn.com.qmth.examcloud.web.support.ControllerSupport;
 import cn.com.qmth.examcloud.web.support.Naked;
 import io.swagger.annotations.ApiOperation;
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.domain.Page;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.ResponseEntity;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.*;
-
-import javax.servlet.http.HttpServletResponse;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
 
 
 /**
@@ -71,21 +82,77 @@ public class ExtractConfigController extends ControllerSupport {
 
     @ApiOperation(value = "保存调卷规则", notes = "保存调卷规则")
     @PutMapping(value = "/extractConfig/{isBuildFile}")
-    public ResponseEntity<Object> saveExtractConfig(@PathVariable Integer isBuildFile, @RequestBody ExtractConfig extractConfig) {
-        try {
-            User user = getAccessUser();
-            extractConfig.setOrgId(user.getRootOrgId() + "");
-            extractConfig.setOrgName(user.getRootOrgName());
-            extractConfigFileService.saveExtractConfigAndBuildPaperFile(extractConfig, isBuildFile, user);
-
-            //清除缓存
-            extractConfigCache.remove(extractConfig.getExamId(), extractConfig.getCourseCode());
+    public ResponseEntity<Object> saveExtractConfig(@PathVariable Integer isBuildFile, @RequestBody ExtractConfig extractConfig, @RequestParam(required = false) PaperSeqMode seqMode) {
+    	String changeInfo=null;
+    	if(extractConfig.getId()!=null) {
+    		changeInfo=getChangeInfo(extractConfig);
+    	}
+        User user = getAccessUser();
+        extractConfig.setOrgId(user.getRootOrgId() + "");
+        extractConfig.setOrgName(user.getRootOrgName());
+        extractConfigFileService.saveExtractConfigAndBuildPaperFile(extractConfig, isBuildFile, user,seqMode);
 
-            return new ResponseEntity<>(HttpStatus.OK);
-        } catch (Exception e) {
-            logger.error(e.getMessage(), e);
-            throw new StatusException("Q-050099", e.getMessage());
+        //清除缓存
+        extractConfigCache.remove(extractConfig.getExamId(), extractConfig.getCourseCode());
+        if(extractConfig.getId()==null) {
+        	ReportsUtil.report(new AdminOperateReport(user.getRootOrgId(), user.getUserId(), "调卷规则-新增调卷规则","课程ID:"+extractConfig.getCourse().getId()+" 考试ID:"+extractConfig.getExamId()));
+        }else {
+        	if(changeInfo!=null) {
+        		ReportsUtil.report(new AdminOperateReport(user.getRootOrgId(), user.getUserId(), "调卷规则-修改调卷规则","课程ID:"+extractConfig.getCourse().getId()+" 考试ID:"+extractConfig.getExamId()+changeInfo));
+        	}
         }
+        return new ResponseEntity<>(HttpStatus.OK);
+    }
+    
+    private String getChangeInfo(ExtractConfig now) {
+    	ExtractConfig old=extractConfigService.findConfigById(now.getId());
+    	StringBuilder sb=new StringBuilder();
+    	boolean paperChange=paperChange(old, now);
+    	if(paperChange) {
+    		sb.append("修改试卷选定,");
+    	}
+    	if(!paperChange&&paperWeightChange(old, now)) {
+    		sb.append("修改试卷选取几率,");
+    	}
+    	if(old.getScrambling_the_question_order()!=now.getScrambling_the_question_order()) {
+    		sb.append("修改客观题小题乱序,");
+    	}
+    	if(old.getScrambling_the_option_order()!=now.getScrambling_the_option_order()) {
+    		sb.append("修改客观题选项乱序,");
+    	}
+    	if(old.getIfFinish()!=now.getIfFinish()) {
+    		sb.append("修改是否生成文件,");
+    	}
+    	if(sb.length()!=0) {
+    		sb.deleteCharAt(sb.length()-1);
+    		return " 修改内容:"+sb.toString();
+    	}
+    	return null;
+    }
+    
+    private boolean paperChange(ExtractConfig old,ExtractConfig now) {
+    	if(old.getExamPaperList().size()!=now.getExamPaperList().size()) {
+    		return true;
+    	}
+    	for(int i=0;i<old.getExamPaperList().size();i++) {
+    		ExamPaper oldPaper=old.getExamPaperList().get(i);
+    		ExamPaper nowPaper=now.getExamPaperList().get(i);
+    		if(!oldPaper.getPaper().getId().equals(nowPaper.getPaper().getId())) {
+    			return true;
+    		}
+    	}
+    	return false;
+    }
+    
+    private boolean paperWeightChange(ExtractConfig old,ExtractConfig now) {
+    	for(int i=0;i<old.getExamPaperList().size();i++) {
+    		ExamPaper oldPaper=old.getExamPaperList().get(i);
+    		ExamPaper nowPaper=now.getExamPaperList().get(i);
+    		if(!oldPaper.getWeight().equals(nowPaper.getWeight())) {
+    			return true;
+    		}
+    	}
+    	return false;
     }
 
     @ApiOperation(value = "根据ID获取调卷规则", notes = "根据ID获取调卷规则")

+ 34 - 0
examcloud-core-questions-api-provider/src/main/java/cn/com/qmth/examcloud/core/questions/api/controller/GenPaperController.java

@@ -6,6 +6,8 @@ import cn.com.qmth.examcloud.core.questions.base.enums.RandomGenPaperPolicy;
 import cn.com.qmth.examcloud.core.questions.service.PaperService;
 import cn.com.qmth.examcloud.core.questions.service.bean.dto.GenPaperDto;
 import cn.com.qmth.examcloud.core.questions.service.impl.GenPaperService;
+import cn.com.qmth.examcloud.reports.commons.bean.AdminOperateReport;
+import cn.com.qmth.examcloud.reports.commons.util.ReportsUtil;
 import cn.com.qmth.examcloud.web.support.ControllerSupport;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -71,6 +73,11 @@ public class GenPaperController extends ControllerSupport {
                     // 按分数 组卷
                     paperMap = genPaperService.genPaperByScore(genPaperDto, user);
                 }
+                if (paperMap.get("msg").equals("success")) {
+	                StringBuilder paperInfo=new StringBuilder();
+	                paperInfo.append("课程:"+genPaperDto.getCourseName()+"("+genPaperDto.getCourseNo()+") 试卷名称:"+genPaperDto.getPaperName());
+	                ReportsUtil.report(new AdminOperateReport(user.getRootOrgId(), user.getUserId(), "考试试卷管理-简易组卷",paperInfo.toString()));
+                }
             } else {
                 //如果是组多套试卷
                 for (int i = 1; i <= genPaperDto.getGenNumber(); i++) {
@@ -81,6 +88,12 @@ public class GenPaperController extends ControllerSupport {
                     } else {
                         paperMap.putAll(genPaperService.genPaperByScore(genPaperDto, user));
                     }
+                    if (!paperMap.get("msg").equals("success")) {
+                        break;
+                    }
+                    StringBuilder paperInfo=new StringBuilder();
+                    paperInfo.append("课程:"+genPaperDto.getCourseName()+"("+genPaperDto.getCourseNo()+") 试卷名称:"+genPaperDto.getPaperName());
+                    ReportsUtil.report(new AdminOperateReport(user.getRootOrgId(), user.getUserId(), "考试试卷管理-简易组卷",paperInfo.toString()));
                 }
             }
             if (!paperMap.get("msg").equals("success")) {
@@ -129,9 +142,17 @@ public class GenPaperController extends ControllerSupport {
                 if (!paperMap.get("msg").equals("success")) {
                     break;
                 }
+                StringBuilder paperInfo=new StringBuilder();
+                paperInfo.append("课程:"+genPaperDto.getCourseName()+"("+genPaperDto.getCourseNo()+") 试卷名称:"+genPaperDto.getPaperName());
+                ReportsUtil.report(new AdminOperateReport(user.getRootOrgId(), user.getUserId(), "考试试卷管理-精细组卷",paperInfo.toString()));
             }
         } else if (genPaperDto.getGenNumber() == 1) {
             paperMap = genPaperService.genPaper(genPaperDto);
+            if (paperMap.get("msg").equals("success")) {
+	            StringBuilder paperInfo=new StringBuilder();
+	            paperInfo.append("课程:"+genPaperDto.getCourseName()+"("+genPaperDto.getCourseNo()+") 试卷名称:"+genPaperDto.getPaperName());
+	            ReportsUtil.report(new AdminOperateReport(user.getRootOrgId(), user.getUserId(), "考试试卷管理-精细组卷",paperInfo.toString()));
+            }
         }
         if (paperMap.get("msg").equals("success")) {
             return new ResponseEntity<>(paperMap, HttpStatus.OK);
@@ -177,9 +198,17 @@ public class GenPaperController extends ControllerSupport {
                 if (!paperMap.get("msg").equals("success")) {
                     break;
                 }
+	            StringBuilder paperInfo=new StringBuilder();
+	            paperInfo.append("课程:"+genPaperDto.getCourseName()+"("+genPaperDto.getCourseNo()+") 试卷名称:"+genPaperDto.getPaperName());
+	            ReportsUtil.report(new AdminOperateReport(user.getRootOrgId(), user.getUserId(), "考试试卷管理-蓝图组卷",paperInfo.toString()));
             }
         } else if (genPaperDto.getGenNumber() == 1) {
             paperMap = genPaperService.genBluePaper(genPaperDto);
+            if (paperMap.get("msg").equals("success")) {
+	            StringBuilder paperInfo=new StringBuilder();
+	            paperInfo.append("课程:"+genPaperDto.getCourseName()+"("+genPaperDto.getCourseNo()+") 试卷名称:"+genPaperDto.getPaperName());
+	            ReportsUtil.report(new AdminOperateReport(user.getRootOrgId(), user.getUserId(), "考试试卷管理-蓝图组卷",paperInfo.toString()));
+            }
         }
         if (paperMap.get("msg").equals("success")) {
             return new ResponseEntity<>(paperMap, HttpStatus.OK);
@@ -208,6 +237,11 @@ public class GenPaperController extends ControllerSupport {
             return new ResponseEntity<>(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
         }
         paperMap = genPaperService.genPaperManual(genPaperDto);
+        if (paperMap.get("msg").equals("success")) {
+            StringBuilder paperInfo=new StringBuilder();
+            paperInfo.append("课程:"+genPaperDto.getCourseName()+"("+genPaperDto.getCourseNo()+") 试卷名称:"+genPaperDto.getPaperName());
+            ReportsUtil.report(new AdminOperateReport(user.getRootOrgId(), user.getUserId(), "考试试卷管理-手动组卷",paperInfo.toString()));
+        }
         if (paperMap.get("msg").equals("success")) {
             return new ResponseEntity<>(paperMap, HttpStatus.OK);
         } else {

+ 27 - 4
examcloud-core-questions-api-provider/src/main/java/cn/com/qmth/examcloud/core/questions/api/controller/ImportPaperController.java

@@ -23,12 +23,18 @@ import org.springframework.web.multipart.commons.CommonsMultipartFile;
 
 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.Model;
 import cn.com.qmth.examcloud.core.questions.base.exception.PaperException;
+import cn.com.qmth.examcloud.core.questions.dao.PaperRepo;
+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.service.ClonePaperService;
 import cn.com.qmth.examcloud.core.questions.service.ImportDdCollegePaperService;
 import cn.com.qmth.examcloud.core.questions.service.ImportPaperService;
+import cn.com.qmth.examcloud.core.questions.service.impl.CourseService;
 import cn.com.qmth.examcloud.core.questions.service.temp.CqdxService;
+import cn.com.qmth.examcloud.reports.commons.bean.AdminOperateReport;
+import cn.com.qmth.examcloud.reports.commons.util.ReportsUtil;
 import cn.com.qmth.examcloud.web.support.ControllerSupport;
 import io.swagger.annotations.ApiOperation;
 
@@ -51,6 +57,11 @@ public class ImportPaperController extends ControllerSupport {
 	private ImportDdCollegePaperService importDdCollegePaperService;
 	@Autowired
 	private CqdxService cqdxService;
+	
+    @Autowired
+    private CourseService courseService;
+    @Autowired
+    private PaperRepo paperRepo;
 
 	/**
 	 * 导入试卷
@@ -68,12 +79,15 @@ public class ImportPaperController extends ControllerSupport {
 		try {
 			tempFile = importPaperService.getUploadFile(file);
 			Paper newPaper = importPaperService.importPaper(paper, user, tempFile);
+			StringBuilder sb=new StringBuilder();
+			sb.append("课程:"+paper.getCourse().getName()+"("+paper.getCourse().getCode()+")");
+			sb.append(" 试卷名称:"+paper.getName());
+	        ReportsUtil.report(new AdminOperateReport(user.getRootOrgId(), user.getUserId(), "导入试卷管理-导入试卷",sb.toString()));
 			return new ResponseEntity<>(newPaper, HttpStatus.OK);
+		} catch (StatusException e) {
+			throw e;
 		} catch (Exception e) {
-			LOGGER.error("导入异常:" + e.getMessage());
-			throw new StatusException("Q-090072", e.getMessage());
-		} finally {
-			LOGGER.info("导入结束");
+			throw new StatusException("500", e.getMessage());
 		}
 	}
 
@@ -109,6 +123,15 @@ public class ImportPaperController extends ControllerSupport {
 		Map<String, Object> map = new HashMap<>();
 		try {
 			clonePaperService.clonePaper(paperId, paperName, courseNo, user);
+	        Paper paper = Model.of(paperRepo.findById(paperId));
+
+	        Course course = courseService.getCourse(user.getRootOrgId(), courseNo);
+			StringBuilder sb=new StringBuilder();
+			sb.append("来源课程:"+paper.getCourse().getName()+"("+paper.getCourse().getCode()+")");
+			sb.append(" 来源试卷名称:"+paper.getName());
+			sb.append(" 复制到课程:"+course.getName()+"("+course.getCode()+")");
+			sb.append(" 复制到试卷名称:"+paperName);
+			ReportsUtil.report(new AdminOperateReport(user.getRootOrgId(), user.getUserId(), "导入试卷管理-复制试卷",sb.toString()));
 			map.put("msg", "success");
 			return new ResponseEntity<>(map, HttpStatus.OK);
 		} catch (PaperException e) {

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

@@ -44,8 +44,8 @@ import com.google.gson.Gson;
 import cn.com.qmth.examcloud.api.commons.security.bean.User;
 import cn.com.qmth.examcloud.commons.exception.StatusException;
 import cn.com.qmth.examcloud.commons.util.PathUtil;
+import cn.com.qmth.examcloud.core.basic.api.OrgCloudService;
 import cn.com.qmth.examcloud.core.questions.base.BeanCopierUtil;
-import cn.com.qmth.examcloud.core.questions.base.SpringContextUtils;
 import cn.com.qmth.examcloud.core.questions.base.StringSimilarityUtils;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExportTemplateType;
 import cn.com.qmth.examcloud.core.questions.base.enums.PaperType;
@@ -53,7 +53,6 @@ import cn.com.qmth.examcloud.core.questions.base.excel.ExportUtils;
 import cn.com.qmth.examcloud.core.questions.base.question.enums.QuesStructType;
 import cn.com.qmth.examcloud.core.questions.dao.ExportServiceManageRepo;
 import cn.com.qmth.examcloud.core.questions.dao.PaperRepo;
-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.PaperSearchInfo;
 import cn.com.qmth.examcloud.core.questions.dao.entity.Question;
@@ -67,6 +66,10 @@ import cn.com.qmth.examcloud.core.questions.service.bean.paper.PreviewPaperHandl
 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.core.questions.service.util.PaperUtil;
+import cn.com.qmth.examcloud.reports.commons.bean.AdminOperateReport;
+import cn.com.qmth.examcloud.reports.commons.util.ReportsUtil;
+import cn.com.qmth.examcloud.support.cache.CacheHelper;
 import cn.com.qmth.examcloud.web.support.ControllerSupport;
 import cn.com.qmth.examcloud.web.support.Naked;
 import freemarker.template.TemplateException;
@@ -99,6 +102,9 @@ public class PaperController extends ControllerSupport {
 
     @Autowired
     ExportServiceManageRepo exportServiceManageRepo;
+    
+    @Autowired
+    OrgCloudService orgCloudService;
 
     /**
      * 根据Id获取试卷
@@ -125,13 +131,38 @@ public class PaperController extends ControllerSupport {
     @PutMapping(value = "/paper")
     public ResponseEntity<Object> savePaperById(@RequestBody PaperExp paper) {
         User user = getAccessUser();
+        String changeInfo=getChangeInfo(paper);
         Map<String, Object> msgMap = paperService.savePaper(paper, user);
         if ("success".equals(msgMap.get("msg"))) {
+        	if(changeInfo!=null) {
+        		if(PaperType.IMPORT.equals(paper.getPaperType())) {
+        			ReportsUtil.report(new AdminOperateReport(user.getRootOrgId(), user.getUserId(), "导入试卷管理-编辑试卷",changeInfo));
+        		}else {
+        			ReportsUtil.report(new AdminOperateReport(user.getRootOrgId(), user.getUserId(), "考试试卷管理-编辑试卷",changeInfo));
+        		}
+        	}
             return new ResponseEntity<>(msgMap, HttpStatus.OK);
         } else {
             throw new StatusException("1000",msgMap.get("msg").toString());
         }
     }
+    
+    private String getChangeInfo(PaperExp paper) {
+    	Paper old = cn.com.qmth.examcloud.core.questions.base.Model.of(paperRepo.findById(paper.getId()));
+        if (old == null) {
+        	return null;
+        }
+        StringBuilder sb=new StringBuilder();
+        if(!old.getName().equals(paper.getName())) {
+        	sb.append("试卷名称变动("+old.getName()+"改为"+paper.getName()+")");
+        }
+        
+    	if(sb.length()!=0) {
+    		return sb.toString();
+    	}
+    	return null;
+        
+    }
 
     /**
      * 查询所有导入试卷
@@ -212,12 +243,19 @@ public class PaperController extends ControllerSupport {
                                                        @PathVariable String[] ids, @PathVariable int curPage, @PathVariable int pageSize) {
         User user = getAccessUser();
         paperSearchInfo.setOrgId(user.getRootOrgId().toString());
+        Page<Paper> ret;
         if (ids != null && ids.length > 0) {
-            return new ResponseEntity<>(paperService.getPapersNotInIds(paperSearchInfo, ids, curPage, pageSize, PaperType.GENERATE),
-                    HttpStatus.OK);
+        	ret=paperService.getPapersNotInIds(paperSearchInfo, ids, curPage, pageSize, PaperType.GENERATE);
+        	if(ret.getContent().size()==0&&ret.getTotalElements()>0&&curPage>1) {
+        		ret=paperService.getPapersNotInIds(paperSearchInfo, ids, curPage-1, pageSize, PaperType.GENERATE);
+        	}
         } else {
-            return new ResponseEntity<>(paperService.getGenPapers(paperSearchInfo, curPage, pageSize), HttpStatus.OK);
+        	ret=paperService.getGenPapers(paperSearchInfo, curPage, pageSize);
+        	if(ret.getContent().size()==0&&ret.getTotalElements()>0&&curPage>1) {
+        		ret=paperService.getGenPapers(paperSearchInfo, curPage-1, pageSize);
+        	}
         }
+        return new ResponseEntity<>(ret, HttpStatus.OK);
     }
 
     /**
@@ -230,8 +268,9 @@ public class PaperController extends ControllerSupport {
     @ApiOperation(value = "删除试卷", notes = "删除试卷")
     @DeleteMapping(value = "/paper/{paperIds}")
     public ResponseEntity<Object> delPaper(@PathVariable String paperIds) {
+    	User user = getAccessUser();
         List<String> paperList = Stream.of(paperIds.split(",")).collect(Collectors.toList());
-        Map<String, Object> msgMap = paperService.deletePapers(paperList);
+        Map<String, Object> msgMap = paperService.deletePapers(paperList,user);
         if (msgMap.get("msg").equals("success")) {
             return new ResponseEntity<>(msgMap, HttpStatus.OK);
         } else {
@@ -373,11 +412,26 @@ public class PaperController extends ControllerSupport {
      * @return
      */
     @ResponseBody
-    @ApiOperation(value = "删除导入试卷中的试题", notes = "删除导入试卷中的试题")
+    @ApiOperation(value = "删除试卷中的试题", notes = "删除试卷中的试题")
     @DeleteMapping(value = "/paper/deleteQuestion/{questionId}")
-    public ResponseEntity<Object> deleteImportPaperQuestion(@PathVariable String questionId) {
+    public ResponseEntity<Object> deletePaperQuestion(@PathVariable String questionId) {
         User user = getAccessUser();
-        List<String> paperNames = paperService.deleteImportQuestionById(questionId, user);
+        List<String> paperNames = paperService.deleteImportQuestionById(null,questionId, user);
+        return new ResponseEntity<>(paperNames, HttpStatus.OK);
+    }
+    
+    /**
+     * 删除导入试卷中的试题
+     *
+     * @param questionId
+     * @return
+     */
+    @ResponseBody
+    @ApiOperation(value = "删除导入试卷中的试题", notes = "删除导入试卷中的试题")
+    @DeleteMapping(value = "/paper/deleteQuestion/{detailUnitId}/{questionId}")
+    public ResponseEntity<Object> deleteImportPaperQuestion(@PathVariable String detailUnitId,@PathVariable String questionId) {
+        User user = getAccessUser();
+        List<String> paperNames = paperService.deleteImportQuestionById(detailUnitId,questionId, user);
         return new ResponseEntity<>(paperNames, HttpStatus.OK);
     }
 
@@ -536,12 +590,19 @@ public class PaperController extends ControllerSupport {
                                                           @PathVariable int pageSize) {
         User user = getAccessUser();
         paperSearchInfo.setOrgId(user.getRootOrgId().toString());
+        Page<Paper> ret;
         if (ids != null && ids.length > 0) {
-            return new ResponseEntity<>(paperService.getPapersNotInIds(paperSearchInfo, ids, curPage, pageSize, PaperType.IMPORT),
-                    HttpStatus.OK);
+        	ret= paperService.getPapersNotInIds(paperSearchInfo, ids, curPage, pageSize, PaperType.IMPORT);
+        	if(ret.getContent().size()==0&&ret.getTotalElements()>0&&curPage>1) {
+        		ret= paperService.getPapersNotInIds(paperSearchInfo, ids, curPage-1, pageSize, PaperType.IMPORT);
+        	}
         } else {
-            return new ResponseEntity<>(paperService.getImportPapers(paperSearchInfo, curPage, pageSize), HttpStatus.OK);
+            ret= paperService.getImportPapers(paperSearchInfo, curPage, pageSize);
+            if(ret.getContent().size()==0&&ret.getTotalElements()>0&&curPage>1) {
+            	ret= paperService.getImportPapers(paperSearchInfo, curPage-1, pageSize);
+            }
         }
+        return new ResponseEntity<>(ret, HttpStatus.OK);
     }
 
     /**
@@ -568,20 +629,24 @@ public class PaperController extends ControllerSupport {
      * @return
      */
     @ResponseBody
-    @ApiOperation(value = "复制导入试卷为组卷", notes = "复制导入试卷为组卷")
+    @ApiOperation(value = "使用原卷", notes = "使用原卷")
     @PutMapping(value = "/useBasePaper/{paperIds}")
     public ResponseEntity<Object> useBasePaper(@PathVariable String paperIds) {
         User user = getAccessUser();
         try {
             String[] paperIdArray = paperIds.split(",");
+            StringBuilder paperInfo=new StringBuilder();
             for (int i = 0; i < paperIdArray.length; i++) {
                 Paper oldpaper = cn.com.qmth.examcloud.core.questions.base.Model.of(paperRepo.findById(paperIdArray[i]));
                 boolean result = paperService.checkPaperName(oldpaper.getName(), PaperType.GENERATE, user.getRootOrgId() + "");
                 if (!result) {
                     throw new StatusException("160565", "考试试卷:" + oldpaper.getName() + "已经存在");
                 }
+                paperInfo.append(" 课程:"+oldpaper.getCourse().getName()+"("+oldpaper.getCourse().getCode()+") 试卷名称:"+oldpaper.getName());
             }
             paperService.useBasePaper(paperIds, user.getDisplayName());
+    		
+            ReportsUtil.report(new AdminOperateReport(user.getRootOrgId(), user.getUserId(), "导入试卷管理-使用原卷",paperInfo.toString()));
             return new ResponseEntity<>(HttpStatus.OK);
         } catch (Exception e) {
             throw new StatusException("160537", e.getMessage());
@@ -621,33 +686,13 @@ public class PaperController extends ControllerSupport {
             throw new StatusException("500", "试卷信息不存在!");
         }
 
-        ExportServiceManage manager = exportServiceManageRepo.findByOrgId(paper.getOrgId());
-        if (manager == null) {
-            throw new StatusException("500", "当前学校尚未配置试卷模板!");
-        }
-
-        ExportPaperAbstractService exportPaperService = SpringContextUtils.getBean(ExportPaperAbstractService.class, manager.getExportServiceName());
+        ExportPaperAbstractService exportPaperService = PaperUtil.getByRootOrgId(paper.getOrgId());
         PaperExp previewPaper = exportPaperService.previewPaperForPDF(paper);
-
-//        model.addAttribute("htmlList", PreviewPaperHandler.convertPaperHtml(previewPaper));
-//        model.addAttribute("orgName", manager.getOrgName());
-//        model.addAttribute("examName", examName);
-//        model.addAttribute("courseNo", previewPaper.getCourseNo());
-//        model.addAttribute("courseName", previewPaper.getCourseName());
-//        model.addAttribute("courseLevel", previewPaper.getCourseLevel());
-
-        //目前只“山东大学”和“陕师大”配了试卷模板
-//        if ("sddxExportPaperService".equals(manager.getExportServiceName())
-//                || "sxsfExportPaperService".equals(manager.getExportServiceName())) {
-//            return String.format("%s_paper", manager.getExportServiceName());
-//        } else {
-//            return "default_paper";
-//        }
         StringWriter result = new StringWriter();
         try {
             Map<String, Object> map = new HashMap<String, Object>();
             map.put("htmlList", PreviewPaperHandler.convertPaperHtml(previewPaper));
-            map.put("orgName", manager.getOrgName());
+            map.put("orgName", CacheHelper.getOrg(Long.valueOf(paper.getOrgId())).getName());
             map.put("examName", examName);
             map.put("courseNo", previewPaper.getCourseNo());
             map.put("courseName", previewPaper.getCourseName());
@@ -675,34 +720,15 @@ public class PaperController extends ControllerSupport {
             throw new StatusException("500", "试卷答案信息不存在!");
         }
 
-        ExportServiceManage manager = exportServiceManageRepo.findByOrgId(paper.getOrgId());
-        if (manager == null) {
-            throw new StatusException("500", "当前学校尚未配置试卷模板!");
-        }
-
-        ExportPaperAbstractService exportPaperService = SpringContextUtils.getBean(ExportPaperAbstractService.class, manager.getExportServiceName());
+        ExportPaperAbstractService exportPaperService = PaperUtil.getByRootOrgId(paper.getOrgId());
         PaperExp previewPaper = exportPaperService.previewPaperForPDF(paper);
 
-//        model.addAttribute("htmlList", PreviewPaperHandler.convertPaperAnswerHtml(previewPaper));
-//        model.addAttribute("orgName", manager.getOrgName());
-//        model.addAttribute("examName", examName);
-//        model.addAttribute("courseNo", previewPaper.getCourseNo());
-//        model.addAttribute("courseName", previewPaper.getCourseName());
-//        model.addAttribute("courseLevel", previewPaper.getCourseLevel());
-//
-//        //目前只“山东大学”和“陕师大”配了试卷模板
-//        if ("sddxExportPaperService".equals(manager.getExportServiceName())
-//                || "sxsfExportPaperService".equals(manager.getExportServiceName())) {
-//            return String.format("%s_answer", manager.getExportServiceName());
-//        } else {
-//            return "default_answer";
-//        }
         
         StringWriter result = new StringWriter();
         try {
             Map<String, Object> map = new HashMap<String, Object>();
             map.put("htmlList", PreviewPaperHandler.convertPaperAnswerHtml(previewPaper));
-            map.put("orgName", manager.getOrgName());
+            map.put("orgName", CacheHelper.getOrg(Long.valueOf(paper.getOrgId())).getName());
             map.put("examName", examName);
             map.put("courseNo", previewPaper.getCourseNo());
             map.put("courseName", previewPaper.getCourseName());
@@ -777,6 +803,10 @@ public class PaperController extends ControllerSupport {
         	throw new StatusException("500", "非法请求");
         }
         paperService.answerImport(paper,dataFile);
+        StringBuilder paperInfo=new StringBuilder();
+		paperInfo.append("课程:"+paper.getCourse().getName()+"("+paper.getCourse().getCode()+")");
+		paperInfo.append(" 试卷名称:"+paper.getName());
+        ReportsUtil.report(new AdminOperateReport(user.getRootOrgId(), user.getUserId(), "导入试卷管理-试卷答案导入",paperInfo.toString()));
     }
     @ApiOperation(value = "下载答案模板", notes = "下载答案模板")
     @GetMapping("/paper/answer/template")

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

@@ -94,9 +94,10 @@ public class PaperDetailController extends ControllerSupport {
      * @return
      */
     @ApiOperation(value = "删除大题", notes = "删除大题")
-    @DeleteMapping(value = "/paperDetail/{detailId}")
-    public ResponseEntity<Object> removePaperDetail(@PathVariable String detailId) {
-        paperDetailService.deletePaperDetail(detailId);
+    @DeleteMapping(value = "/paperDetail/{paperId}/{detailId}")
+    public ResponseEntity<Object> removePaperDetail(@PathVariable String paperId,@PathVariable String detailId) {
+    	User user = getAccessUser();
+        paperDetailService.deletePaperDetail(paperId,detailId,user);
         return new ResponseEntity<>(detailId, HttpStatus.OK);
     }
 
@@ -111,5 +112,13 @@ public class PaperDetailController extends ControllerSupport {
     public ResponseEntity<Object> getPaperDetailsByPaperId(@PathVariable String paperId) {
         return new ResponseEntity<>(paperService.findPaperDetailsById(paperId), HttpStatus.OK);
     }
+    
+    @ApiOperation(value = "移动大题", notes = "移动大题")
+    @PutMapping(value = "/paperDetail/{paperId}/{detailId}/{vc}")
+    public ResponseEntity<Object> movePaperDetail(@PathVariable String paperId,@PathVariable String detailId,@PathVariable String vc) {
+    	User user = getAccessUser();
+        paperDetailService.movePaperDetail(paperId,detailId,vc,user);
+        return new ResponseEntity<>(detailId, HttpStatus.OK);
+    }
 
 }

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

@@ -3,6 +3,7 @@ package cn.com.qmth.examcloud.core.questions.api.controller;
 import java.util.List;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
@@ -16,7 +17,9 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
+
 import com.google.gson.Gson;
+
 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.dao.QuesRepo;
@@ -101,7 +104,8 @@ public class QuesController extends ControllerSupport {
     @ApiOperation(value = "新增试题", notes = "新增试题")
     @PostMapping(value = "/question")
     public ResponseEntity<Object> addQuestion(@RequestBody Question question) {
-        return new ResponseEntity<>(quesService.saveQues(question), HttpStatus.CREATED);
+    	ResponseEntity<Object> ret=new ResponseEntity<>(quesService.saveQues(question), HttpStatus.CREATED);
+        return  ret;
     }
 
     /**

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

@@ -837,8 +837,7 @@ public final class CommonUtils {
             String[] fbsArr = {"\\", "$", "(", ")", "*", "+", ".", "[", "]", "?", "^", "{", "}", "|"};
             for (String key : fbsArr) {
                 if (keyword.contains(key)) {
-                    keyword = keyword.replace(key, "\\" + key);
-                    return keyword;
+                    keyword = keyword.replaceAll("\\" +key, "\\\\" + key);
                 }
             }
         }

+ 0 - 224
examcloud-core-questions-base/src/main/java/cn/com/qmth/examcloud/core/questions/base/converter/utils/JsonMapper.java

@@ -1,224 +0,0 @@
-/*
- * *************************************************
- * Copyright (c) 2018 QMTH. All Rights Reserved.
- * Created by Deason on 2018-07-12 15:31:09.
- * *************************************************
- */
-
-package cn.com.qmth.examcloud.core.questions.base.converter.utils;
-
-import com.fasterxml.jackson.annotation.JsonInclude.Include;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.*;
-import com.fasterxml.jackson.databind.util.JSONPObject;
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * 简单封装Jackson,实现JSON 与 Java Object互相转换的Mapper
- * 封装不同的输出风格, 使用不同的builder函数创建实例
- */
-@SuppressWarnings("unchecked")
-public class JsonMapper {
-    private static Logger log = LoggerFactory.getLogger(JsonMapper.class);
-    private ObjectMapper mapper;
-
-    public JsonMapper() {
-        this(null);
-    }
-
-    public JsonMapper(Include include) {
-        mapper = new ObjectMapper();
-        //设置输出时包含属性的风格
-        if (include != null) {
-            mapper.setSerializationInclusion(include);
-        }
-        //设置输入时忽略在JSON字符串中存在但Java对象实际没有的属性
-        mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
-    }
-
-    /**
-     * 创建只输出非Null且非Empty(如List.isEmpty)的属性到Json字符串的Mapper,建议在外部接口中使用
-     */
-    public static JsonMapper nonEmptyMapper() {
-        return new JsonMapper(Include.NON_EMPTY);
-    }
-
-    public static JsonMapper nonNullMapper() {
-        return new JsonMapper(Include.NON_NULL);
-    }
-
-    /**
-     * 创建只输出初始值被改变的属性到Json字符串的Mapper, 最节约的存储方式,建议在内部接口中使用
-     */
-    public static JsonMapper nonDefaultMapper() {
-        return new JsonMapper(Include.NON_DEFAULT);
-    }
-
-    /**
-     * Object可以是POJO,也可以是Collection或数组
-     * 如果对象为Null, 返回"null"
-     * 如果集合为空集合, 返回"[]"
-     */
-    public String toJson(Object object) {
-        try {
-            return mapper.writeValueAsString(object);
-        } catch (IOException e) {
-            log.error("write to json string error:" + object);
-            return null;
-        }
-    }
-
-    /**
-     * 反序列化POJO或简单Collection如List<String>
-     * 如果JSON字符串为Null或"null"字符串, 返回Null
-     * 如果JSON字符串为"[]", 返回空集合
-     * 如需反序列化复杂Collection如List<MyBean>, 请使用fromJson(String, JavaType)
-     */
-    public <T> T fromJson(String jsonString, Class<T> clazz) {
-        if (StringUtils.isEmpty(jsonString)) {
-            return null;
-        }
-        try {
-            return mapper.readValue(jsonString, clazz);
-        } catch (IOException e) {
-            log.error("parse json string error", e);
-            return null;
-        }
-    }
-
-    /**
-     * 反序列化复杂Collection如List<Bean>, 先使用createCollectionType()或constructMapType()构造类型, 然后调用本函数
-     */
-    public <T> T fromJson(String jsonString, JavaType javaType) {
-        if (StringUtils.isEmpty(jsonString)) {
-            return null;
-        }
-        try {
-            return (T) mapper.readValue(jsonString, javaType);
-        } catch (IOException e) {
-            log.error("parse json string error", e);
-            return null;
-        }
-    }
-
-    /**
-     * 反序列化复杂的对象,如Page<Bean>
-     */
-    public <T> T fromJson(String jsonString, TypeReference javaType) {
-        if (StringUtils.isEmpty(jsonString)) {
-            return null;
-        }
-        try {
-            return (T) mapper.readValue(jsonString, javaType);
-        } catch (IOException e) {
-            log.error("parse json string error", e);
-            return null;
-        }
-    }
-
-    /**
-     * json to list
-     */
-    public <T> List<T> toList(String jsonString, Class<T> bean) {
-        if (StringUtils.isEmpty(jsonString)) {
-            return null;
-        }
-        try {
-            JavaType javaType = constructCollectionType(List.class, bean);
-            return mapper.readValue(jsonString, javaType);
-        } catch (IOException e) {
-            log.error("parse json string error", e);
-            return null;
-        }
-    }
-
-    /**
-     * json to simple HashMap
-     */
-    public <T> Map<String, T> toHashMap(String jsonString, Class<T> bean) {
-        if (StringUtils.isEmpty(jsonString)) {
-            return null;
-        }
-        try {
-            JavaType javaType = constructMapType(HashMap.class, String.class, bean);
-            return mapper.readValue(jsonString, javaType);
-        } catch (IOException e) {
-            log.error("parse json string error:", e);
-            return null;
-        }
-    }
-
-    /**
-     * 构造Collection类型
-     */
-    public JavaType constructCollectionType(Class<? extends Collection> collectionClass, Class<?> elementClass) {
-        return mapper.getTypeFactory().constructCollectionType(collectionClass, elementClass);
-    }
-
-    /**
-     * 构造Map类型
-     */
-    public JavaType constructMapType(Class<? extends Map> mapClass, Class<?> keyClass, Class<?> valueClass) {
-        return mapper.getTypeFactory().constructMapType(mapClass, keyClass, valueClass);
-    }
-
-    /**
-     * 当JSON里只含有Bean的部分屬性時,更新一個已存在Bean,只覆盖該部分的屬性
-     */
-    public void update(String jsonString, Object object) {
-        try {
-            mapper.readerForUpdating(object).readValue(jsonString);
-        } catch (JsonProcessingException e) {
-            log.error("update json string:" + jsonString + " to object:" + object + " error.");
-        } catch (IOException e) {
-            log.error("update json string:" + jsonString + " to object:" + object + " error.");
-        }
-    }
-
-    /**
-     * 輸出JSONP格式数据
-     */
-    public String toJsonP(String functionName, Object object) {
-        return toJson(new JSONPObject(functionName, object));
-    }
-
-    /**
-     * 設定是否使用Enum的toString函數來读写Enum
-     * 為False時使用Enum的name()函數來读写Enum, 默認為False
-     * 注意本函數一定要在Mapper創建後, 所有的读写動作之前調用
-     */
-    public void enableEnumUseToString() {
-        mapper.enable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING);
-        mapper.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING);
-    }
-
-    /**
-     * 取出Mapper做进一步的设置或使用其他序列化API
-     */
-    public ObjectMapper getMapper() {
-        return mapper;
-    }
-
-    /***
-     * 把Json字符串转换成Node对象
-     */
-    public JsonNode getNode(String jsonStr) {
-        try {
-            //mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);
-            return mapper.readTree(jsonStr);
-        } catch (IOException e) {
-            log.error(e.getMessage(), e);
-            return null;
-        }
-    }
-
-}

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

@@ -9,14 +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;
-
-    private int grandNum = 0;
-
     private int index = 0;
 
     private Set<String> types = new HashSet<String>();
@@ -55,28 +49,4 @@ public class ExportTempDataDto {
         this.mainNum = mainNum;
     }
 
-    public int getSubNum() {
-        return subNum;
-    }
-
-    public void setSubNum(int subNum) {
-        this.subNum = subNum;
-    }
-
-    public int getGrandNum() {
-        return grandNum;
-    }
-
-    public void setGrandNum(int grandNum) {
-        this.grandNum = grandNum;
-    }
-
-    public int getAnswerNum() {
-        return answerNum;
-    }
-
-    public void setAnswerNum(int answerNum) {
-        this.answerNum = answerNum;
-    }
-
 }

+ 32 - 0
examcloud-core-questions-base/src/main/java/cn/com/qmth/examcloud/core/questions/base/enums/PaperSeqMode.java

@@ -0,0 +1,32 @@
+package cn.com.qmth.examcloud.core.questions.base.enums;
+
+public enum PaperSeqMode {
+	/**
+	 * 单题型连续
+	 */
+	MODE1("单题型连续"),
+	/**
+	 * 客观题整体连续
+	 */
+	MODE2("客观题整体连续"),
+	/**
+	 * 按大题独立
+	 */
+	MODE3("按大题独立"),
+	
+	/**
+	 * 按大题独立(套题内也独立)
+	 */
+	MODE4("按大题独立(套题内也独立)");
+
+	private String name;
+
+	PaperSeqMode(String name) {
+		this.name = name;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+}

+ 22 - 0
examcloud-core-questions-base/src/main/java/cn/com/qmth/examcloud/core/questions/base/exception/QuesNotEnoughException.java

@@ -0,0 +1,22 @@
+package cn.com.qmth.examcloud.core.questions.base.exception;
+
+/**题源数量不够
+ * @author chenken
+ *
+ */
+public class QuesNotEnoughException extends Exception {
+
+
+    /**
+	 * 
+	 */
+	private static final long serialVersionUID = 4281754672695042664L;
+
+	public QuesNotEnoughException() {
+        super();
+    }
+
+    public QuesNotEnoughException(String message) {
+        super(message);
+    }
+}

+ 28 - 0
examcloud-core-questions-base/src/main/java/cn/com/qmth/examcloud/core/questions/base/processor/HttpMethodProcessorImpl.java

@@ -0,0 +1,28 @@
+package cn.com.qmth.examcloud.core.questions.base.processor;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.springframework.stereotype.Component;
+
+import cn.com.qmth.examcloud.reports.commons.util.ReportsUtil;
+import cn.com.qmth.examcloud.web.support.HttpMethodProcessor;
+
+@Component
+public class HttpMethodProcessorImpl implements HttpMethodProcessor {
+
+	@Override
+	public void beforeMethod(HttpServletRequest request, Object[] args) {
+
+	}
+
+	@Override
+	public void onSuccess(HttpServletRequest request, Object[] args, Object ret) {
+		ReportsUtil.sendReport(false);
+	}
+
+	@Override
+	public void onException(HttpServletRequest request, Object[] args, Throwable e) {
+		ReportsUtil.sendReport(true);
+	}
+
+}

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

@@ -148,6 +148,11 @@ public class ImportPaperMsg {
      * 选项排列顺序
      */
     public static final String errMsg_13 = "格式错误,请仔细检查(1、选项序号有误,必须从A开始且按字母顺序排列ABCDEF;2、选项内容不对)";
+    
+    /**
+     * 内容不完整,没有[答案]标签,请检查
+     */
+    public static final String errMsg_14 = "内容不完整,没有[答案]标签,请检查\n";
 
     /**
      * [一级属性]

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

@@ -2,6 +2,7 @@ package cn.com.qmth.examcloud.core.questions.dao.entity;
 
 import java.util.Map;
 
+import org.springframework.data.annotation.Transient;
 import org.springframework.data.mongodb.core.index.Indexed;
 
 import cn.com.qmth.examcloud.core.questions.base.CommonUtils;
@@ -65,6 +66,19 @@ public class Paper extends MongoBaseEntity {
     private String sameName; //相同大题名 0:不合并,1:合并
 
     private String examRemark;//考试说明
+    
+    /**
+     * 公开\非公开小题数量
+     */
+    @Transient
+    private Map<String,Integer> quesCount;
+    
+    /**
+     * 公开\非公开小题分数
+     */
+    @Transient
+    private Map<String,Double> quesScore;
+    
 
     public String getName() {
         return name;
@@ -246,4 +260,22 @@ public class Paper extends MongoBaseEntity {
         this.examRemark = examRemark;
     }
 
+
+	public Map<String, Integer> getQuesCount() {
+		return quesCount;
+	}
+
+	public void setQuesCount(Map<String, Integer> quesCount) {
+		this.quesCount = quesCount;
+	}
+
+	public Map<String, Double> getQuesScore() {
+		return quesScore;
+	}
+
+	public void setQuesScore(Map<String, Double> quesScore) {
+		this.quesScore = quesScore;
+	}
+
+	
 }

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

@@ -1,5 +1,8 @@
 package cn.com.qmth.examcloud.core.questions.dao.entity;
 
+import java.util.List;
+
+import org.springframework.data.annotation.Transient;
 import org.springframework.data.mongodb.core.mapping.DBRef;
 
 import cn.com.qmth.examcloud.core.questions.dao.entity.base.MongoBaseEntity;
@@ -26,6 +29,25 @@ public class PaperDetail extends MongoBaseEntity implements Comparable<PaperDeta
     private String creator;// 创建人id
 
     private String createTime;// 创建时间
+    
+    /**
+     * 大题排序
+     */
+    @Transient
+    private Long sortNumber;
+    
+    /**
+     * 大题二级排序
+     */
+    @Transient
+    private Integer sortNumberSub;
+    
+    
+    /**
+     * 小题集合,判断大题排序用
+     */
+    @Transient
+    private List<PaperDetailUnit> paperDetailUnits;
 
     public Paper getPaper() {
         return paper;
@@ -111,4 +133,30 @@ public class PaperDetail extends MongoBaseEntity implements Comparable<PaperDeta
         return -1;
     }
 
+	public Long getSortNumber() {
+		return sortNumber;
+	}
+
+	public void setSortNumber(Long sortNumber) {
+		this.sortNumber = sortNumber;
+	}
+
+	public List<PaperDetailUnit> getPaperDetailUnits() {
+		return paperDetailUnits;
+	}
+
+	public void setPaperDetailUnits(List<PaperDetailUnit> paperDetailUnits) {
+		this.paperDetailUnits = paperDetailUnits;
+	}
+
+	public Integer getSortNumberSub() {
+		return sortNumberSub;
+	}
+
+	public void setSortNumberSub(Integer sortNumberSub) {
+		this.sortNumberSub = sortNumberSub;
+	}
+
+	
+    
 }

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

@@ -266,10 +266,16 @@ public class PaperDetailUnit extends MongoBaseEntity implements Comparable<Paper
     }
 
     public int getDetailNumber() {
+    	if(this.paperDetail==null) {
+    		return -1;
+    	}
         return this.paperDetail.getNumber();
     }
 
     public String getDetailId() {
+    	if(this.paperDetail==null) {
+    		return null;
+    	}
         return this.paperDetail.getId();
     }
 

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

@@ -119,6 +119,12 @@ public class Question extends MongoBaseEntity {
 
     @Transient
     private List<QuestionAudio> audioList;// 音频列表(复制试卷使用,不存数据)
+    
+    /**
+     * 下载试卷小题显示序号
+     */
+    @Transient
+    private int questionSeq;
 
     public void addAudio(QuestionAudio audio) {
         if (audioList == null) {
@@ -434,4 +440,14 @@ public class Question extends MongoBaseEntity {
         this.quesOptionsWord = quesOptionsWord;
     }
 
+	public int getQuestionSeq() {
+		return questionSeq;
+	}
+
+	public void setQuestionSeq(int questionSeq) {
+		this.questionSeq = questionSeq;
+	}
+    
+    
+
 }

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

@@ -139,7 +139,7 @@ public class ClonePaperService {
             this.savePaperDetails(detailMaps, newPaper, user);
         } catch (Exception e) {
             //如果试题保存失败,则还原数据
-            paperService.deletePapers(Lists.newArrayList(newPaper.getId()));
+            paperService.deletePapers(Lists.newArrayList(newPaper.getId()),user);
             throw new PaperException("克隆试卷失败!");
         }
     }

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

@@ -5,6 +5,8 @@ import java.util.List;
 
 import javax.servlet.http.HttpServletResponse;
 
+import cn.com.qmth.examcloud.api.commons.security.bean.User;
+import cn.com.qmth.examcloud.core.questions.base.enums.PaperSeqMode;
 import cn.com.qmth.examcloud.core.questions.dao.entity.Course;
 
 public interface ExportPaperService {
@@ -12,14 +14,14 @@ public interface ExportPaperService {
     /**
      * 导出单个试卷,答案,机考数据包
      */
-    public void exportPaperFile(String paperId, String serviceName, String exportContentList,
-            HttpServletResponse response, String loginName, String examType, String psw, Long rootOrgId);
+    public void exportPaperFile(String paperId,String exportContentList,
+            HttpServletResponse response, PaperSeqMode seqMode, String examType, String psw, User user);
 
     /**
      * 批量导出试卷,答案,机考数据包
      */
-    public void exportPaperFiles(List<String> paperList, String serviceName, String exportContentList,
-            HttpServletResponse response, String loginName, String examType, Long rootOrgId) throws Exception;
+    public void exportPaperFiles(List<String> paperList,String exportContentList,
+            HttpServletResponse response, PaperSeqMode seqMode, String examType, User user) throws Exception;
 
     /**
      * 导出课程下的试题分布Excel(按课程)
@@ -41,6 +43,6 @@ public interface ExportPaperService {
      */
     public void downOriginalPaper(String paperId, String loginName, HttpServletResponse response) throws Exception;
 
-    public void downOriginalPaperPlus(String paperId, Long rootOrgId, HttpServletResponse response) throws Exception;
+    public void downOriginalPaperPlus(String paperId, Long rootOrgId, HttpServletResponse response) throws IOException;
 
 }

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

@@ -1,6 +1,7 @@
 package cn.com.qmth.examcloud.core.questions.service;
 
 import cn.com.qmth.examcloud.api.commons.security.bean.User;
+import cn.com.qmth.examcloud.core.questions.base.enums.PaperSeqMode;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExtractConfig;
 import cn.com.qmth.examcloud.core.questions.service.bean.dto.ExportPaperInfoModel;
 
@@ -22,7 +23,7 @@ public interface ExtractConfigFileService {
      * @param accessUser
      * @throws Exception
      */
-    public void saveExtractConfigAndBuildPaperFile(ExtractConfig extractConfig, Integer isbuildFile, User user) throws Exception;
+    public void saveExtractConfigAndBuildPaperFile(ExtractConfig extractConfig, Integer isbuildFile, User user,PaperSeqMode seqMode);
 
     /**
      * 导出考试下的试卷信息  校验

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

@@ -52,7 +52,7 @@ public interface ExtractConfigService {
      * @return
      * @throws Exception
      */
-    public List<ExamPaper> saveExtractConfig(ExtractConfig extractConfig, User user) throws Exception;
+    public List<ExamPaper> saveExtractConfig(ExtractConfig extractConfig, User user);
 
     /**
      * 按照设定调卷规则生成一套试卷
@@ -145,4 +145,6 @@ public interface ExtractConfigService {
      */
     public List<CouresInfo> findCourseByExtractConfig(Long examId, String orgId);
 
+	List<ExtractConfig> findExtractConfig(Long examId);
+
 }

+ 198 - 228
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/ImportPaperService.java

@@ -276,146 +276,145 @@ public class ImportPaperService {
      */
 
     public Paper processImportPaper(Paper paper, User user, File file) throws Exception {
-        // 得到前台的课程代码
-        String courseNo = paper.getCourseNo();
-        WordprocessingMLPackage wordMLPackage;
-        WordprocessingMLPackage tmpWordMlPackage;
-        // WordprocessingMLPackage writePkg;
-        ImportPaperCheck importPaperCheck = new ImportPaperCheck();
-
-        wordMLPackage = WordprocessingMLPackage.load(file);
-        // 初始化图片路径
-        DocxProcessUtil.initPkgImage(wordMLPackage);
-        // 深拷贝临时pkg与最终写入数据库pkg
-        tmpWordMlPackage = DocxProcessUtil.getTmpPackage(wordMLPackage);
-
-        // 获取word文档中所有段落
-        List<Object> pList = DocxProcessUtil.getAllElementFromObject(wordMLPackage.getMainDocumentPart(), P.class);
-        // 设置试卷
-        initPaper(paper, paper.getName(), user);
-        // 创建空大题类
-        PaperDetail paperDetail = null;
-        // 创建大题集合
-        List<PaperDetail> paperDetails = new ArrayList<>();
-        // 创建小题集合
-        List<PaperDetailUnit> paperDetailUnits = new ArrayList<>();
-        // 创建试题集合
-        List<Question> questions = new ArrayList<>();
-        // 大题号
-        int mainQuesNum = 0;
-        // 小题号
-        int subQuesNum = 0;
-        // 大题下的小题序号
-        int errorQuesNum = 0;
-        for (int i = 0; i < pList.size(); i++) {
-            P p = (P) pList.get(i);
-            String pText = DocxProcessUtil.getPText(p);
-            if (StringUtils.isEmpty(pText)) {
-                // 跳过空白段落
-                continue;
-            } else if (isMainQuesHeader(pText)) {
-                // 处理大题头信息
-                processMainQuesHeader(pList, importPaperCheck.getIndex(), importPaperCheck, courseNo);
-                // 校验大题头信息
-                if (!checkQuesHeader(importPaperCheck)) {
-                    throw new PaperException(importPaperCheck.getErrorInfo());
-                }
-                // 创建大题类
-                paperDetail = new PaperDetail();
-                // 设置大题类
-                initQuesHeader(paper, paperDetail, paperDetails, ++mainQuesNum, importPaperCheck);
-                // 设置当前索引,防止多余循环
-                i = importPaperCheck.getIndex() - 1;
-                errorQuesNum = 0;
-            } else if (DocxProcessUtil.isNumPr(p)) {
-                // 检测到序列
-                importPaperCheck.setErrorInfo(importPaperCheck.getQuesName() + ImportPaperMsg.errMsg_10);
-                throw new PaperException(importPaperCheck.getErrorInfo());
-
-            } else if ((pText.matches("^\\d{1,}\\.[\\s\\S]*") && !pText.startsWith(ImportPaperMsg.left_bracket))
-                    || (isNested(importPaperCheck) && pText.startsWith(ImportPaperMsg.nestedQuestion_start))) {
-                if (paperDetail == null) {
-                    throw new PaperException("导入文件格式有误,必须有大题头信息,且以 [ 开头!");
-                }
-                ++errorQuesNum;
-                ++subQuesNum;
-                // 处理试题
-                // 创建小题类和试题类
-                PaperDetailUnit paperDetailUnit = new PaperDetailUnit();
-                Question question = new Question();
-                // 初始化小题类和试题类
-                initPaperDetail(paper, paperDetail, paperDetailUnit, question, subQuesNum, importPaperCheck);
-                // 处理客观题
-                if (importPaperCheck.getQuesType().equals(ImportPaperMsg.singleSelection)
-                        || importPaperCheck.getQuesType().equals(ImportPaperMsg.multipleSelection)) {
-                    // 处理题干
-                    processQuesBody(pList, importPaperCheck.getIndex(), subQuesNum, question, importPaperCheck,
-                            tmpWordMlPackage, errorQuesNum);
-                    // 处理选项
-                    processQuesOption(pList, importPaperCheck.getIndex(), subQuesNum, question, importPaperCheck,
-                            tmpWordMlPackage, errorQuesNum);
-                    // 处理尾信息
-                    processQuesTail(pList, importPaperCheck.getIndex(), subQuesNum, question, paperDetailUnit,
-                            importPaperCheck, tmpWordMlPackage, false, paper, errorQuesNum);
-                    // 处理选择题的option--chenken 20170425
-                    processSelectOption(question);
-                } else if (importPaperCheck.getQuesType().equals(ImportPaperMsg.nestedQuestion_word)) {
-                    // 处理套题
-                    processNestedQues(pList, importPaperCheck.getIndex(), question, paperDetailUnit, importPaperCheck,
-                            tmpWordMlPackage, paper);
-                } else {
-                    // 处理其他题型
-                    processQuesBody(pList, importPaperCheck.getIndex(), subQuesNum, question, importPaperCheck,
-                            tmpWordMlPackage, errorQuesNum);
-                    processQuesTail(pList, importPaperCheck.getIndex(), subQuesNum, question, paperDetailUnit,
-                            importPaperCheck, tmpWordMlPackage, false, paper, errorQuesNum);
-                    // 填空题空格校验
-                    if (question.getQuestionType().getName().equals(QuesStructType.FILL_BLANK_QUESTION.getName())) {
-                        if (!StringUtils.isBlank(question.getQuesAnswer())) {
-                            processFill(question, paperDetailUnit, importPaperCheck, subQuesNum, errorQuesNum);
-                        }
-                    }
-                }
-                // 设置WordMlPackage二进制数据
-//                byte[] pkgByte = getZipResource(wordMLPackage, question);
-//                QuestionPkgPath quesPkgPath = quesPkgPathRepo.save(new QuestionPkgPath(pkgByte));
-//                question.setQuesPkgPathId(quesPkgPath.getId());
-//                pkgByte = null;
-//                quesPkgPath.setQuesPkg(null);
-                // 设置question与Unit集合数据
-                question.setCourse(paper.getCourse());
-                question.setOrgId(user.getRootOrgId().toString());
-                questions.add(question);
-                paperDetailUnits.add(paperDetailUnit);
-                // 设置当前索引,防止多余循环
-                i = importPaperCheck.getIndex() - 1;
-            } else if (paperDetail == null) {
-                throw new PaperException("导入文件格式有误,必须有大题头信息,且以[试题分类]开头!");
-            } else {
-                String errorMsg = pText.length() > 10 ? pText.substring(0, 10) : pText;
-                if (pText.startsWith(ImportPaperMsg.left_bracket)) {
-                    throw new PaperException(
-                            errorMsg + ",标签格式不正确!正确标签格式:[套题]、[套题数量]、[小题分数]、[答案]、[难度]、[一级属性]、[二级属性]、[公开度]、[小题型]");
-                }
-                throw new PaperException(
-                        importPaperCheck.getQuesName() + ":“" + errorMsg + "”" + ImportPaperMsg.errMsg_12);
-            }
-            if (!StringUtils.isEmpty(importPaperCheck.getErrorInfo())) {
-                throw new PaperException(importPaperCheck.getErrorInfo());
-            }
-        }
-        if (paperDetails.size() == 0 || paperDetailUnits.size() == 0) {
-            throw new PaperException("导入文件格式有误!");
-        }
-        paper.setPaperDetailCount(mainQuesNum);
-
-        // 保存导入试卷信息
-        paper = savePaper(paper, paperDetails, paperDetailUnits, questions, importPaperCheck);
-        clearPaper(paperDetails, paperDetailUnits, questions);
-
-        wordMLPackage = null;
-        tmpWordMlPackage = null;
-        FileUtils.deleteQuietly(file);
+        try {
+			// 得到前台的课程代码
+			String courseNo = paper.getCourseNo();
+			WordprocessingMLPackage wordMLPackage;
+			WordprocessingMLPackage tmpWordMlPackage;
+			// WordprocessingMLPackage writePkg;
+			ImportPaperCheck importPaperCheck = new ImportPaperCheck();
+			wordMLPackage = WordprocessingMLPackage.load(file);
+			// 初始化图片路径
+			DocxProcessUtil.initPkgImage(wordMLPackage);
+			// 深拷贝临时pkg与最终写入数据库pkg
+			tmpWordMlPackage = DocxProcessUtil.getTmpPackage(wordMLPackage);
+			// 获取word文档中所有段落
+			List<Object> pList = DocxProcessUtil.getAllElementFromObject(wordMLPackage.getMainDocumentPart(), P.class);
+			// 设置试卷
+			initPaper(paper, paper.getName(), user);
+			// 创建空大题类
+			PaperDetail paperDetail = null;
+			// 创建大题集合
+			List<PaperDetail> paperDetails = new ArrayList<>();
+			// 创建小题集合
+			List<PaperDetailUnit> paperDetailUnits = new ArrayList<>();
+			// 创建试题集合
+			List<Question> questions = new ArrayList<>();
+			// 大题号
+			int mainQuesNum = 0;
+			// 小题号
+			int subQuesNum = 0;
+			// 大题下的小题序号
+			int errorQuesNum = 0;
+			for (int i = 0; i < pList.size(); i++) {
+				P p = (P) pList.get(i);
+				String pText = DocxProcessUtil.getPText(p);
+				if (StringUtils.isEmpty(pText)) {
+					// 跳过空白段落
+					continue;
+				} else if (isMainQuesHeader(pText)) {
+					// 处理大题头信息
+					processMainQuesHeader(pList, importPaperCheck.getIndex(), importPaperCheck, courseNo);
+					// 校验大题头信息
+					if (!checkQuesHeader(importPaperCheck)) {
+						throw new PaperException(importPaperCheck.getErrorInfo());
+					}
+					// 创建大题类
+					paperDetail = new PaperDetail();
+					// 设置大题类
+					initQuesHeader(paper, paperDetail, paperDetails, ++mainQuesNum, importPaperCheck);
+					// 设置当前索引,防止多余循环
+					i = importPaperCheck.getIndex() - 1;
+					errorQuesNum = 0;
+				} else if (DocxProcessUtil.isNumPr(p)) {
+					// 检测到序列
+					importPaperCheck.setErrorInfo(importPaperCheck.getQuesName() + ImportPaperMsg.errMsg_10);
+					throw new PaperException(importPaperCheck.getErrorInfo());
+
+				} else if ((pText.matches("^\\d{1,}\\.[\\s\\S]*") && !pText.startsWith(ImportPaperMsg.left_bracket))
+						|| (isNested(importPaperCheck) && pText.startsWith(ImportPaperMsg.nestedQuestion_start))) {
+					if (paperDetail == null) {
+						throw new PaperException("导入文件格式有误,必须有大题头信息,且以 [ 开头!");
+					}
+					++errorQuesNum;
+					++subQuesNum;
+					// 处理试题
+					// 创建小题类和试题类
+					PaperDetailUnit paperDetailUnit = new PaperDetailUnit();
+					Question question = new Question();
+					// 初始化小题类和试题类
+					initPaperDetail(paper, paperDetail, paperDetailUnit, question, subQuesNum, importPaperCheck);
+					// 处理客观题
+					if (importPaperCheck.getQuesType().equals(ImportPaperMsg.singleSelection)
+							|| importPaperCheck.getQuesType().equals(ImportPaperMsg.multipleSelection)) {
+						// 处理题干
+						processQuesBody(pList, importPaperCheck.getIndex(), subQuesNum, question, importPaperCheck,
+								tmpWordMlPackage, errorQuesNum);
+						// 处理选项
+						processQuesOption(pList, importPaperCheck.getIndex(), subQuesNum, question, importPaperCheck,
+								tmpWordMlPackage, errorQuesNum);
+						// 处理尾信息
+						processQuesTail(pList, importPaperCheck.getIndex(), subQuesNum, question, paperDetailUnit,
+								importPaperCheck, tmpWordMlPackage, false, paper, errorQuesNum);
+						// 处理选择题的option--chenken 20170425
+						processSelectOption(question);
+					} else if (importPaperCheck.getQuesType().equals(ImportPaperMsg.nestedQuestion_word)) {
+						// 处理套题
+						processNestedQues(pList, importPaperCheck.getIndex(), question, paperDetailUnit,
+								importPaperCheck, tmpWordMlPackage, paper);
+					} else {
+						// 处理其他题型
+						processQuesBody(pList, importPaperCheck.getIndex(), subQuesNum, question, importPaperCheck,
+								tmpWordMlPackage, errorQuesNum);
+						processQuesTail(pList, importPaperCheck.getIndex(), subQuesNum, question, paperDetailUnit,
+								importPaperCheck, tmpWordMlPackage, false, paper, errorQuesNum);
+						// 填空题空格校验
+						if (question.getQuestionType().getName().equals(QuesStructType.FILL_BLANK_QUESTION.getName())) {
+							if (!StringUtils.isBlank(question.getQuesAnswer())) {
+								processFill(question, paperDetailUnit, importPaperCheck, subQuesNum, errorQuesNum);
+							}
+						}
+					}
+					// 设置WordMlPackage二进制数据
+					//                byte[] pkgByte = getZipResource(wordMLPackage, question);
+					//                QuestionPkgPath quesPkgPath = quesPkgPathRepo.save(new QuestionPkgPath(pkgByte));
+					//                question.setQuesPkgPathId(quesPkgPath.getId());
+					//                pkgByte = null;
+					//                quesPkgPath.setQuesPkg(null);
+					// 设置question与Unit集合数据
+					question.setCourse(paper.getCourse());
+					question.setOrgId(user.getRootOrgId().toString());
+					questions.add(question);
+					paperDetailUnits.add(paperDetailUnit);
+					// 设置当前索引,防止多余循环
+					i = importPaperCheck.getIndex() - 1;
+				} else if (paperDetail == null) {
+					throw new PaperException("导入文件格式有误,必须有大题头信息,且以[试题分类]开头!");
+				} else {
+					String errorMsg = pText.length() > 10 ? pText.substring(0, 10) : pText;
+					if (pText.startsWith(ImportPaperMsg.left_bracket)) {
+						throw new PaperException(
+								errorMsg + ",标签格式不正确!正确标签格式:[套题]、[套题数量]、[小题分数]、[答案]、[难度]、[一级属性]、[二级属性]、[公开度]、[小题型]");
+					}
+					throw new PaperException(
+							importPaperCheck.getQuesName() + ":“" + errorMsg + "”" + ImportPaperMsg.errMsg_12);
+				}
+				if (!StringUtils.isEmpty(importPaperCheck.getErrorInfo())) {
+					throw new PaperException(importPaperCheck.getErrorInfo());
+				}
+			}
+			if (paperDetails.size() == 0 || paperDetailUnits.size() == 0) {
+				throw new PaperException("导入文件格式有误!");
+			}
+			paper.setPaperDetailCount(mainQuesNum);
+			// 保存导入试卷信息
+			paper = savePaper(paper, paperDetails, paperDetailUnits, questions, importPaperCheck);
+			clearPaper(paperDetails, paperDetailUnits, questions);
+			wordMLPackage = null;
+			tmpWordMlPackage = null;
+		} finally {
+			FileUtils.deleteQuietly(file);
+		}
         return paper;
     }
 
@@ -743,6 +742,7 @@ public class ImportPaperService {
         // 定义题干wordml和html
         StringBuilder quesBodyWordMl = new StringBuilder();
         StringBuilder quesBodyHtml = new StringBuilder();
+        boolean hasSeq=false;
         int i = 0;
         for (i = index; i < pList.size(); i++) {
             P pBody = (P) pList.get(i);
@@ -756,6 +756,29 @@ public class ImportPaperService {
                 throw new PaperException(importPaperCheck.getErrorInfo());
 
             } else if (tmpText.matches("^\\d{1,}\\.[\\s\\S]*")) {
+            	if(hasSeq) {
+            		// 检测到序列
+            		if (subQuesNum == 0) {
+                        if (importPaperCheck.getNestedHeadNumber() != 0) {
+                            importPaperCheck.setErrorInfo(importPaperCheck.getQuesName() + "第"
+                                    + importPaperCheck.getNestedHeadNumber() + "个题" + ImportPaperMsg.errMsg_14);
+                        } else {
+                            importPaperCheck.setErrorInfo(
+                                    getQuesNumInfo(importPaperCheck, errorQuesNum) + ImportPaperMsg.errMsg_14);
+                        }
+                    } else {
+                        if (importPaperCheck.getNestedHeadNumber() != 0) {
+                            importPaperCheck.setErrorInfo(importPaperCheck.getQuesName() + "第"
+                                    + importPaperCheck.getNestedHeadNumber() + "个题" + errorQuesNum + ImportPaperMsg.errMsg_14);
+                        } else {
+                            importPaperCheck.setErrorInfo(
+                                    getQuesNumInfo(importPaperCheck, errorQuesNum) + ImportPaperMsg.errMsg_14);
+                        }
+                    }
+                    throw new PaperException(importPaperCheck.getErrorInfo());
+            	}else {
+            		hasSeq=true;
+            	}
                 // 题干第一段
                 // 过滤题干标题
                 pBody = DocxProcessUtil.formatP(pBody, QuesUnit.QUES_BODY);
@@ -781,7 +804,7 @@ public class ImportPaperService {
                             + importPaperCheck.getNestedHeadNumber() + "个题" + ImportPaperMsg.errMsg_01);
                 } else {
                     importPaperCheck.setErrorInfo(
-                            getQuesNumInfo(importPaperCheck.getQuesName(), errorQuesNum) + ImportPaperMsg.errMsg_01);
+                            getQuesNumInfo(importPaperCheck, errorQuesNum) + ImportPaperMsg.errMsg_01);
                 }
             } else {
                 if (importPaperCheck.getNestedHeadNumber() != 0) {
@@ -789,7 +812,7 @@ public class ImportPaperService {
                             + importPaperCheck.getNestedHeadNumber() + "个题" + errorQuesNum + ImportPaperMsg.errMsg_01);
                 } else {
                     importPaperCheck.setErrorInfo(
-                            getQuesNumInfo(importPaperCheck.getQuesName(), errorQuesNum) + ImportPaperMsg.errMsg_01);
+                            getQuesNumInfo(importPaperCheck, errorQuesNum) + ImportPaperMsg.errMsg_01);
                 }
             }
             throw new PaperException(importPaperCheck.getErrorInfo());
@@ -836,7 +859,7 @@ public class ImportPaperService {
                             + importPaperCheck.getNestedHeadNumber() + "个题" + errorQuesNum + ImportPaperMsg.errMsg_11);
                 } else {
                     importPaperCheck.setErrorInfo(
-                            getQuesNumInfo(importPaperCheck.getQuesName(), errorQuesNum) + ImportPaperMsg.errMsg_11);
+                            getQuesNumInfo(importPaperCheck, errorQuesNum) + ImportPaperMsg.errMsg_11);
                 }
                 throw new PaperException(importPaperCheck.getErrorInfo());
             } else if (tmpText.matches("^[a-zA-Z]\\.[\\s\\S]*")) {
@@ -852,7 +875,7 @@ public class ImportPaperService {
                                 importPaperCheck.getQuesName() + "第" + importPaperCheck.getNestedHeadNumber() + "个题"
                                         + errorQuesNum + ":“" + errorMsg + "”" + ImportPaperMsg.errMsg_13);
                     } else {
-                        importPaperCheck.setErrorInfo(getQuesNumInfo(importPaperCheck.getQuesName(), errorQuesNum)
+                        importPaperCheck.setErrorInfo(getQuesNumInfo(importPaperCheck, errorQuesNum)
                                 + ":“" + errorMsg + "”" + ImportPaperMsg.errMsg_13);
                     }
                     throw new PaperException(importPaperCheck.getErrorInfo());
@@ -886,7 +909,7 @@ public class ImportPaperService {
                         + importPaperCheck.getNestedHeadNumber() + "个题" + errorQuesNum + "中选项格式不正确或有缺失\n");
             } else {
                 importPaperCheck
-                        .setErrorInfo(getQuesNumInfo(importPaperCheck.getQuesName(), errorQuesNum) + "中选项格式不正确或有缺失\n");
+                        .setErrorInfo(getQuesNumInfo(importPaperCheck, errorQuesNum) + "中选项格式不正确或有缺失\n");
             }
             throw new PaperException(importPaperCheck.getErrorInfo());
         } else {
@@ -1014,11 +1037,11 @@ public class ImportPaperService {
                 if (question.getQuestionType() == QuesStructType.SINGLE_ANSWER_QUESTION
                         || question.getQuestionType() == QuesStructType.MULTIPLE_ANSWER_QUESTION) {
                     importPaperCheck.setErrorInfo(
-                            getQuesNumInfo(importPaperCheck.getQuesName(), subQuesNum) + "中,答案格式不正确,答案为:" + pList.get(i).toString());
+                            getQuesNumInfo(importPaperCheck, subQuesNum) + "中,答案格式不正确,答案为:" + pList.get(i).toString());
                     throw new PaperException(importPaperCheck.getErrorInfo());
                 }else if(question.getQuestionType() == QuesStructType.BOOL_ANSWER_QUESTION){
                     importPaperCheck.setErrorInfo(
-                            getQuesNumInfo(importPaperCheck.getQuesName(), subQuesNum) + "中,答案格式不正确,应为:正确或错误");
+                            getQuesNumInfo(importPaperCheck, subQuesNum) + "中,答案格式不正确,应为:正确或错误");
                 }
             } else {
                 break;
@@ -1032,7 +1055,7 @@ public class ImportPaperService {
                         + paperDetailUnit.getNumber() + "个套题的" + errorQuesNum + "小题中,缺失“[答案]”");
             } else {
                 importPaperCheck
-                        .setErrorInfo(getQuesNumInfo(importPaperCheck.getQuesName(), errorQuesNum) + "中,缺失“[答案]”");
+                        .setErrorInfo(getQuesNumInfo(importPaperCheck, errorQuesNum) + "中,缺失“[答案]”");
             }
             throw new PaperException(importPaperCheck.getErrorInfo());
         }
@@ -1094,13 +1117,8 @@ public class ImportPaperService {
             int subQuesNum, Paper paper, List<QuesProperty> quesProperties) throws Exception {
         // 一级属性为空,二级属性有值
         if (StringUtils.isBlank(firstProperty) && StringUtils.isNotBlank(secondProperty)) {
-            if (importPaperCheck.getNestedHeadNumber() != 0) {
-                importPaperCheck.setErrorInfo(importPaperCheck.getQuesName() + "第"
-                        + importPaperCheck.getNestedHeadNumber() + "个题" + subQuesNum + "中,小题一级属性值为空,请检查");
-            } else {
                 importPaperCheck
-                        .setErrorInfo(getQuesNumInfo(importPaperCheck.getQuesName(), subQuesNum) + "中,小题一级属性值为空,请检查");
-            }
+                        .setErrorInfo(getQuesNumInfo(importPaperCheck, subQuesNum) + "中,小题一级属性值为空,请检查");
             throw new PaperException(importPaperCheck.getErrorInfo());
         }
         // 一级属性,二级属性都有值
@@ -1111,13 +1129,8 @@ public class ImportPaperService {
             List<CourseProperty> courseProperties = coursePropertyRepo
                     .findByCourseCodeAndEnable(paper.getCourse().getCode(), true);
             if (courseProperties == null || courseProperties.size() < 1) {
-                if (importPaperCheck.getNestedHeadNumber() != 0) {
-                    importPaperCheck.setErrorInfo(importPaperCheck.getQuesName() + "第"
-                            + importPaperCheck.getNestedHeadNumber() + "个题" + subQuesNum + "中,没有设置课程属性结构,请先设置课程属性结构");
-                } else {
                     importPaperCheck.setErrorInfo(
-                            getQuesNumInfo(importPaperCheck.getQuesName(), subQuesNum) + "中,没有设置课程属性结构,请先设置课程属性结构");
-                }
+                            getQuesNumInfo(importPaperCheck, subQuesNum) + "中,没有设置课程属性结构,请先设置课程属性结构");
                 throw new PaperException(importPaperCheck.getErrorInfo());
             }
 
@@ -1160,26 +1173,14 @@ public class ImportPaperService {
             }
 
             if (isFirstEmpty) {
-                if (importPaperCheck.getNestedHeadNumber() != 0) {
-                    importPaperCheck
-                            .setErrorInfo(importPaperCheck.getQuesName() + "第" + importPaperCheck.getNestedHeadNumber()
-                                    + "个题" + subQuesNum + "中,小题一级属性值与课程属性中一级属性不匹配,请检查");
-                } else {
                     importPaperCheck.setErrorInfo(
-                            getQuesNumInfo(importPaperCheck.getQuesName(), subQuesNum) + "中,小题一级属性值与课程属性中一级属性不匹配,请检查");
-                }
+                            getQuesNumInfo(importPaperCheck, subQuesNum) + "中,小题一级属性值与课程属性中一级属性不匹配,请检查");
                 throw new PaperException(importPaperCheck.getErrorInfo());
             }
 
             if (isSecondEmpty) {
-                if (importPaperCheck.getNestedHeadNumber() != 0) {
-                    importPaperCheck
-                            .setErrorInfo(importPaperCheck.getQuesName() + "第" + importPaperCheck.getNestedHeadNumber()
-                                    + "个题" + subQuesNum + "中,小题二级属性值与课程属性中二级属性不匹配,请检查");
-                } else {
                     importPaperCheck.setErrorInfo(
-                            getQuesNumInfo(importPaperCheck.getQuesName(), subQuesNum) + "中,小题二级属性值与课程属性中二级属性不匹配,请检查");
-                }
+                            getQuesNumInfo(importPaperCheck, subQuesNum) + "中,小题二级属性值与课程属性中二级属性不匹配,请检查");
                 throw new PaperException(importPaperCheck.getErrorInfo());
             }
         } else if (StringUtils.isNotBlank(firstProperty) && StringUtils.isBlank(secondProperty)) {
@@ -1192,13 +1193,8 @@ public class ImportPaperService {
             List<CourseProperty> courseProperties = coursePropertyRepo
                     .findByCourseCodeAndEnable(paper.getCourse().getCode(), true);
             if (courseProperties == null || courseProperties.size() < 1) {
-                if (importPaperCheck.getNestedHeadNumber() != 0) {
-                    importPaperCheck.setErrorInfo(importPaperCheck.getQuesName() + "第"
-                            + importPaperCheck.getNestedHeadNumber() + "个题" + subQuesNum + "中,没有设置课程属性结构,请先设置课程属性结构");
-                } else {
                     importPaperCheck.setErrorInfo(
-                            getQuesNumInfo(importPaperCheck.getQuesName(), subQuesNum) + "中,没有设置课程属性结构,请先设置课程属性结构");
-                }
+                            getQuesNumInfo(importPaperCheck, subQuesNum) + "中,没有设置课程属性结构,请先设置课程属性结构");
                 throw new PaperException(importPaperCheck.getErrorInfo());
             }
 
@@ -1234,26 +1230,14 @@ public class ImportPaperService {
                 }
             }
             if (isFirstEmpty) {
-                if (importPaperCheck.getNestedHeadNumber() != 0) {
-                    importPaperCheck
-                            .setErrorInfo(importPaperCheck.getQuesName() + "第" + importPaperCheck.getNestedHeadNumber()
-                                    + "个题" + subQuesNum + "中,小题一级属性值与课程属性中一级属性不匹配,请检查");
-                } else {
                     importPaperCheck.setErrorInfo(
-                            getQuesNumInfo(importPaperCheck.getQuesName(), subQuesNum) + "中,小题一级属性值与课程属性中一级属性不匹配,请检查");
-                }
+                            getQuesNumInfo(importPaperCheck, subQuesNum) + "中,小题一级属性值与课程属性中一级属性不匹配,请检查");
                 throw new PaperException(importPaperCheck.getErrorInfo());
             }
 
             if (isSecondEmpty) {
-                if (importPaperCheck.getNestedHeadNumber() != 0) {
-                    importPaperCheck
-                            .setErrorInfo(importPaperCheck.getQuesName() + "第" + importPaperCheck.getNestedHeadNumber()
-                                    + "个题" + subQuesNum + "中,小题二级属性值与课程属性中二级属性不匹配,请检查");
-                } else {
                     importPaperCheck.setErrorInfo(
-                            getQuesNumInfo(importPaperCheck.getQuesName(), subQuesNum) + "中,小题二级属性值与课程属性中二级属性不匹配,请检查");
-                }
+                            getQuesNumInfo(importPaperCheck, subQuesNum) + "中,小题二级属性值与课程属性中二级属性不匹配,请检查");
                 throw new PaperException(importPaperCheck.getErrorInfo());
             }
         } else {
@@ -1272,46 +1256,26 @@ public class ImportPaperService {
     private void checkAttributeIsFull(String firstProperty, String secondProperty, Double difficulty, Boolean publicity,
             ImportPaperCheck importPaperCheck, int subQuesNum) throws Exception {
         if (firstProperty == null) {
-            if (importPaperCheck.getNestedHeadNumber() != 0) {
-                importPaperCheck.setErrorInfo(importPaperCheck.getQuesName() + "第"
-                        + importPaperCheck.getNestedHeadNumber() + "个题" + subQuesNum + "中,小题一级属性缺失,请检查");
-            } else {
                 importPaperCheck
-                        .setErrorInfo(getQuesNumInfo(importPaperCheck.getQuesName(), subQuesNum) + "中,小题一级属性缺失,请检查");
-            }
+                        .setErrorInfo(getQuesNumInfo(importPaperCheck, subQuesNum) + "中,小题一级属性缺失,请检查");
             throw new PaperException(importPaperCheck.getErrorInfo());
         }
 
         if (secondProperty == null) {
-            if (importPaperCheck.getNestedHeadNumber() != 0) {
-                importPaperCheck.setErrorInfo(importPaperCheck.getQuesName() + "第"
-                        + importPaperCheck.getNestedHeadNumber() + "个题" + subQuesNum + "中,小题二级属性缺失,请检查");
-            } else {
                 importPaperCheck
-                        .setErrorInfo(getQuesNumInfo(importPaperCheck.getQuesName(), subQuesNum) + "中,小题二级属性缺失,请检查");
-            }
+                        .setErrorInfo(getQuesNumInfo(importPaperCheck, subQuesNum) + "中,小题二级属性缺失,请检查");
             throw new PaperException(importPaperCheck.getErrorInfo());
         }
 
         if (difficulty == null) {
-            if (importPaperCheck.getNestedHeadNumber() != 0) {
-                importPaperCheck.setErrorInfo(importPaperCheck.getQuesName() + "第"
-                        + importPaperCheck.getNestedHeadNumber() + "个题" + subQuesNum + "中,小题难度缺失,请检查");
-            } else {
                 importPaperCheck
-                        .setErrorInfo(getQuesNumInfo(importPaperCheck.getQuesName(), subQuesNum) + "中,小题难度缺失,请检查");
-            }
+                        .setErrorInfo(getQuesNumInfo(importPaperCheck, subQuesNum) + "中,小题难度缺失,请检查");
             throw new PaperException(importPaperCheck.getErrorInfo());
         }
 
         if (publicity == null) {
-            if (importPaperCheck.getNestedHeadNumber() != 0) {
-                importPaperCheck.setErrorInfo(importPaperCheck.getQuesName() + "第"
-                        + importPaperCheck.getNestedHeadNumber() + "个题" + subQuesNum + "中,小题公开性缺失,请检查");
-            } else {
                 importPaperCheck
-                        .setErrorInfo(getQuesNumInfo(importPaperCheck.getQuesName(), subQuesNum) + "中,小题公开性缺失,请检查");
-            }
+                        .setErrorInfo(getQuesNumInfo(importPaperCheck, subQuesNum) + "中,小题公开性缺失,请检查");
             throw new PaperException(importPaperCheck.getErrorInfo());
         }
     }
@@ -1429,10 +1393,10 @@ public class ImportPaperService {
             } else if (subQuesNum != quesTypeNum) {
                 if (StringUtils.isEmpty(nestedQuesType)) {
                     importPaperCheck.setErrorInfo(
-                            getQuesNumInfo(importPaperCheck.getQuesName(), quesTypeNum) + ImportPaperMsg.errMsg_02);
+                            getQuesNumInfo(importPaperCheck, quesTypeNum) + ImportPaperMsg.errMsg_02);
                 } else {
                     importPaperCheck.setErrorInfo(
-                            getQuesNumInfo(importPaperCheck.getQuesName(), quesTypeNum) + ImportPaperMsg.errMsg_03);
+                            getQuesNumInfo(importPaperCheck, quesTypeNum) + ImportPaperMsg.errMsg_03);
                 }
                 throw new PaperException(importPaperCheck.getErrorInfo());
             } else if (isHeader(tmpText)) {
@@ -1548,8 +1512,14 @@ public class ImportPaperService {
      * @param subQuesNum
      * @return
      */
-    public static String getQuesNumInfo(String quesType, int subQuesNum) {
-        return quesType + "第" + subQuesNum + "小题";
+    public static String getQuesNumInfo(ImportPaperCheck importPaperCheck, int subQuesNum) {
+        if (importPaperCheck.getNestedHeadNumber() == 0) {
+        	return "[大题名称]:" + importPaperCheck.getQuesName() + "第" + subQuesNum + "小题";
+        } else {
+        	return "[大题名称]:" + importPaperCheck.getQuesName() + "第"
+                    + importPaperCheck.getNestedHeadNumber() + "小题,第" + subQuesNum
+                    + "子题";
+        }
     }
 
     /**
@@ -1703,7 +1673,7 @@ public class ImportPaperService {
         if (!StringUtils.isBlank(answerWord)) {
             if (question.getQuestionType() == QuesStructType.SINGLE_ANSWER_QUESTION&&answerWord.contains(",")) {
                 importPaperCheck.setErrorInfo(
-                        getQuesNumInfo(importPaperCheck.getQuesName(), subQuesNum) + "中,答案格式不正确,答案为:" + answerWord);
+                        getQuesNumInfo(importPaperCheck, subQuesNum) + "中,答案格式不正确,答案为:" + answerWord);
                 throw new PaperException(importPaperCheck.getErrorInfo());
             }
             String[] pAnswerArray = answerWord.split(",");
@@ -1719,11 +1689,11 @@ public class ImportPaperService {
                 String pattern = "[A-Z]|[a-z]";
                 if (!Pattern.matches(pattern, answer)) {
                     importPaperCheck.setErrorInfo(
-                            getQuesNumInfo(importPaperCheck.getQuesName(), subQuesNum) + "中,答案格式不正确,答案为:" + answerWord);
+                            getQuesNumInfo(importPaperCheck, subQuesNum) + "中,答案格式不正确,答案为:" + answerWord);
                     throw new PaperException(importPaperCheck.getErrorInfo());
                 }
                 if (!optionNumList.contains(answer)) {
-                    importPaperCheck.setErrorInfo(getQuesNumInfo(importPaperCheck.getQuesName(), subQuesNum) + "中,选项为:"
+                    importPaperCheck.setErrorInfo(getQuesNumInfo(importPaperCheck, subQuesNum) + "中,选项为:"
                             + optionNumList.toString() + ",答案为:" + answerWord + "。(注:若检查选项无问题,请检查word中题目的格式是否正确)");
                     throw new PaperException(importPaperCheck.getErrorInfo());
                 }
@@ -1746,7 +1716,7 @@ public class ImportPaperService {
                 return;
             } else {
                 importPaperCheck.setErrorInfo(
-                        getQuesNumInfo(importPaperCheck.getQuesName(), subQuesNum) + "中,答案格式不正确,应为:正确或错误");
+                        getQuesNumInfo(importPaperCheck, subQuesNum) + "中,答案格式不正确,应为:正确或错误");
                 throw new PaperException(importPaperCheck.getErrorInfo());
             }
         }
@@ -1765,7 +1735,7 @@ public class ImportPaperService {
         } else if (!isInteger(tmpText) || (Double.parseDouble(tmpText) < 1) || (Double.parseDouble(tmpText) > 10)) {
             // 如果不是整数,或者在1到10之间,就报错
             importPaperCheck
-                    .setErrorInfo(getQuesNumInfo(importPaperCheck.getQuesName(), subQuesNum) + "中,试题难度只能是1到10之间整数");
+                    .setErrorInfo(getQuesNumInfo(importPaperCheck, subQuesNum) + "中,试题难度只能是1到10之间整数");
             throw new PaperException(importPaperCheck.getErrorInfo());
         } else {
             tempDifficulty = Double.parseDouble(tmpText) / 10;
@@ -1796,7 +1766,7 @@ public class ImportPaperService {
         } else if (!tmpText.equals("公开") && !tmpText.equals("非公开")) {
             // 如果不是公开和非公开,就报错
             importPaperCheck
-                    .setErrorInfo(getQuesNumInfo(importPaperCheck.getQuesName(), subQuesNum) + "中,试题公开度只能是公开和非公开");
+                    .setErrorInfo(getQuesNumInfo(importPaperCheck, subQuesNum) + "中,试题公开度只能是公开和非公开");
             throw new PaperException(importPaperCheck.getErrorInfo());
         } else {
             if (tmpText.equals("非公开")) {

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

@@ -38,7 +38,7 @@ public interface PaperDetailService {
      * @param id
      * @return
      */
-    public void deletePaperDetail(String id);
+    public void deletePaperDetail(String paperId,String id,User user);
 
     /**
      * 查询同一个试卷对象对应大题
@@ -61,4 +61,6 @@ public interface PaperDetailService {
      * @param papers
      */
     public void deletePaperDetailsByPapers(List<Paper> papers);
+
+	public void movePaperDetail(String paperId, String detailId, String vc, User user);
 }

+ 3 - 3
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/PaperService.java

@@ -121,7 +121,7 @@ public interface PaperService {
      *
      * @param paperIds
      */
-    public Map<String, Object> deletePapers(List<String> paperIds);
+    public Map<String, Object> deletePapers(List<String> paperIds,User user);
 
     /**
      * 批量通过试卷
@@ -186,7 +186,7 @@ public interface PaperService {
      * @param questionId
      * @return
      */
-    public List<String> deleteImportQuestionById(String questionId, User user);
+    public List<String> deleteImportQuestionById(String detailUnitId,String questionId, User user);
 
     /**
      * 向试卷中插入一个试题
@@ -288,7 +288,7 @@ public interface PaperService {
      * @param paperId
      * @return
      */
-    public PaperExp getDownPaperExp(String paperId) throws Exception;
+    public PaperExp getDownPaperExp(String paperId);
 
     /**
      * 根据试卷id,公开度,难度查询题目数量

+ 3 - 1
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/bean/context/PaperContext.java

@@ -4,6 +4,7 @@ import cn.com.qmth.examcloud.core.questions.base.IdUtils;
 import cn.com.qmth.examcloud.core.questions.base.enums.PaperType;
 import cn.com.qmth.examcloud.core.questions.dao.entity.*;
 import cn.com.qmth.examcloud.core.questions.service.bean.condition.Condition;
+import cn.com.qmth.examcloud.core.questions.service.util.PaperUtil;
 
 import java.util.ArrayList;
 import java.util.LinkedList;
@@ -47,8 +48,9 @@ public class PaperContext extends Context {
             PaperDetail pd = tempMap.keySet().iterator().next();
             units.addAll(tempMap.get(pd));
             detailList.add(pd);
-
+            pd.setPaperDetailUnits(tempMap.get(pd));
         }
+//        PaperUtil.sortDetails(detailList);
         list.add(paper);
         list.add(detailList);
         list.add(units);

+ 70 - 0
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/bean/dto/DownloadPaperDto.java

@@ -0,0 +1,70 @@
+package cn.com.qmth.examcloud.core.questions.service.bean.dto;
+
+import cn.com.qmth.examcloud.core.questions.base.enums.PaperSeqMode;
+
+public class DownloadPaperDto {
+	private Long rootOrgId;
+	private String paperId;
+	private String zipFileName;
+	private String examType;
+	private PaperSeqMode seqMode;
+
+	public Long getRootOrgId() {
+		return rootOrgId;
+	}
+
+	public void setRootOrgId(Long rootOrgId) {
+		this.rootOrgId = rootOrgId;
+	}
+
+	public String getPaperId() {
+		return paperId;
+	}
+
+	public void setPaperId(String paperId) {
+		this.paperId = paperId;
+	}
+
+	public String getZipFileName() {
+		return zipFileName;
+	}
+
+	public void setZipFileName(String zipFileName) {
+		this.zipFileName = zipFileName;
+	}
+
+	public String getExamType() {
+		return examType;
+	}
+
+	public void setExamType(String examType) {
+		this.examType = examType;
+	}
+
+
+	
+	
+	public DownloadPaperDto(Long rootOrgId, String paperId, String zipFileName, String examType, PaperSeqMode seqMode) {
+		super();
+		this.rootOrgId = rootOrgId;
+		this.paperId = paperId;
+		this.zipFileName = zipFileName;
+		this.examType = examType;
+		this.seqMode = seqMode;
+	}
+
+	public DownloadPaperDto() {
+		super();
+	}
+
+	public PaperSeqMode getSeqMode() {
+		return seqMode;
+	}
+
+	public void setSeqMode(PaperSeqMode seqMode) {
+		this.seqMode = seqMode;
+	}
+
+	
+	
+}

+ 15 - 4
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/bean/dto/GenPaperDto.java

@@ -1,14 +1,14 @@
 package cn.com.qmth.examcloud.core.questions.service.bean.dto;
 
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+
 import cn.com.qmth.examcloud.core.questions.base.core.enums.CourseLevel;
 import cn.com.qmth.examcloud.core.questions.base.enums.RandomGenPaperPolicy;
 import cn.com.qmth.examcloud.core.questions.dao.entity.Course;
 import cn.com.qmth.examcloud.core.questions.service.bean.condition.Condition;
 
-import java.io.Serializable;
-import java.util.List;
-import java.util.Map;
-
 /**
  * Created by songyue on 17/3/24.
  */
@@ -26,6 +26,8 @@ public class GenPaperDto implements Serializable {
 
     private String paperName;// 试卷名称
 
+    private List<String> frozenPaperIds;// 冻结试卷ID集合
+    
     private List<String> paperIds;// 试卷ID集合
 
     //private Map<String, Double> simpleParams;// 简单组卷规则
@@ -152,4 +154,13 @@ public class GenPaperDto implements Serializable {
         this.course = course;
     }
 
+	public List<String> getFrozenPaperIds() {
+		return frozenPaperIds;
+	}
+
+	public void setFrozenPaperIds(List<String> frozenPaperIds) {
+		this.frozenPaperIds = frozenPaperIds;
+	}
+
+    
 }

+ 37 - 0
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/bean/dto/PaperDetailExp.java

@@ -28,6 +28,16 @@ public class PaperDetailExp implements Serializable, Comparable<PaperDetailExp>
     private Integer unitCount;//大题下的小题数量
 
     private List<PaperDetailUnitExp> paperDetailUnits;
+    
+    
+    private List<Long> questionTypes;
+    
+    private boolean nested;
+    
+    /**
+     * 导出成卷时是否重置本大题的小题题序
+     */
+    private Boolean resetSubQuesSeq;
 
     /**
      * 大题排序
@@ -160,5 +170,32 @@ public class PaperDetailExp implements Serializable, Comparable<PaperDetailExp>
         }
         return -1;
     }
+
+	public Boolean isResetSubQuesSeq() {
+		return resetSubQuesSeq;
+	}
+
+	public void setResetSubQuesSeq(Boolean resetSubQuesSeq) {
+		this.resetSubQuesSeq = resetSubQuesSeq;
+	}
+
+
+	public boolean isNested() {
+		return nested;
+	}
+
+	public void setNested(boolean nested) {
+		this.nested = nested;
+	}
+
+	public List<Long> getQuestionTypes() {
+		return questionTypes;
+	}
+
+	public void setQuestionTypes(List<Long> questionTypes) {
+		this.questionTypes = questionTypes;
+	}
+
+    
 }
 

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

@@ -38,7 +38,7 @@ import cn.com.qmth.examcloud.core.questions.base.converter.model.platform.PaperV
 import cn.com.qmth.examcloud.core.questions.base.converter.model.platform.QuestionVo;
 import cn.com.qmth.examcloud.core.questions.base.converter.utils.Cryptogram;
 import cn.com.qmth.examcloud.core.questions.base.converter.utils.FileUtil;
-import cn.com.qmth.examcloud.core.questions.base.converter.utils.JsonMapper;
+import cn.com.qmth.examcloud.commons.util.JsonMapper;
 import cn.com.qmth.examcloud.core.questions.base.converter.utils.NumUtil;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExamFileType;
 import cn.com.qmth.examcloud.core.questions.dao.entity.Paper;

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

@@ -1,102 +0,0 @@
-package cn.com.qmth.examcloud.core.questions.service.export;
-
-import java.io.File;
-import java.util.List;
-
-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.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.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
- * @date 2018年8月14日 上午11:29:49
- * @company QMTH
- * @description 北京航空大学导出、上传文件service
- */
-@Service("bjhkExportPaperService")
-public class BjhkExportPaperService extends ExportPaperAbstractService {
-
-    @Override
-    public void downloadPaper(Long rootOrgId, String paperId, String zipFileName, String examType) throws Exception {
-        PaperExp paperExp = super.initPaperExp(paperId);
-        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 directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
-            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,paperfileName, ExportTemplateType.PAPER_EXPORT);
-            // 下载音频
-            super.downloadAudio(paperExp, zipFileName);
-        }
-    }
-
-    @Override
-    public void downloadPaperAnswer(Long rootOrgId, String paperId, String zipFileName) throws Exception {
-        PaperExp paperExp = initPaperExp(paperId);
-        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 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 {
-        PaperExp paperExp = initPaperExp(paperId);
-        if (paperExp != null) {
-            String currNum = CommonUtils.getCurNum();
-            // 删除原有试卷文件
-            /*
-             * ExamFile examFile = new ExamFile();
-             * examFile.setExamId(extractConfig.getExamId()+"");
-             * examFile.setCourseId(extractConfig.getCourseCode());
-             * examFile.setOrgId(extractConfig.getOrgId());
-             * examFileService.deleteExamFile(examFile);
-             */
-            // 没有试卷结构导出设置
-            if (exportStructure == null) {
-                // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, 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,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, 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) {
-                // 上传机考JSON文件
-                uploadComputerTestFile(extractConfig, accessUser, examPaper);
-            }
-        }
-    }
-
-}

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

@@ -1,90 +0,0 @@
-package cn.com.qmth.examcloud.core.questions.service.export;
-
-import java.io.File;
-import java.util.List;
-
-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.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.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 {
-
-    @Override
-    public void downloadPaper(Long rootOrgId, String paperId, String zipFileName, String examType) throws Exception {
-        PaperExp paperExp = super.initPaperExp(paperId);
-        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 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 = initPaperExp(paperId);
-        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 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 {
-        PaperExp paperExp = initPaperExp(paperId);
-        if (paperExp != null) {
-            String currNum = CommonUtils.getCurNum();
-            // 删除原有试卷文件
-            /*
-             * ExamFile examFile = new ExamFile();
-             * examFile.setExamId(extractConfig.getExamId()+"");
-             * examFile.setCourseId(extractConfig.getCourseCode());
-             * examFile.setOrgId(extractConfig.getOrgId());
-             * examFileService.deleteExamFile(examFile);
-             */
-            // 没有试卷结构导出设置
-            if (exportStructure == null) {
-                // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, 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,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, 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) {
-                // 上传机考JSON文件
-                uploadComputerTestFile(extractConfig, accessUser, examPaper);
-            }
-        }
-    }
-
-}

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

@@ -1,102 +0,0 @@
-package cn.com.qmth.examcloud.core.questions.service.export;
-
-import java.io.File;
-import java.util.List;
-
-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.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.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
- * @date 2018年6月2日 上午11:29:49
- * @company QMTH
- * @description 北京师范大学导出、上传文件service
- */
-@Service("bjsfExportPaperService")
-public class BjsfExportPaperService extends ExportPaperAbstractService {
-
-    @Override
-    public void downloadPaper(Long rootOrgId, String paperId, String zipFileName, String examType) throws Exception {
-        PaperExp paperExp = super.initPaperExp(paperId);
-        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 directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
-            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,paperfileName, ExportTemplateType.PAPER_EXPORT);
-            // 下载音频
-            super.downloadAudio(paperExp, zipFileName);
-        }
-    }
-
-    @Override
-    public void downloadPaperAnswer(Long rootOrgId, String paperId, String zipFileName) throws Exception {
-        PaperExp paperExp = initPaperExp(paperId);
-        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 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 {
-        PaperExp paperExp = initPaperExp(paperId);
-        if (paperExp != null) {
-            String currNum = CommonUtils.getCurNum();
-            // 删除原有试卷文件
-            /*
-             * ExamFile examFile = new ExamFile();
-             * examFile.setExamId(extractConfig.getExamId()+"");
-             * examFile.setCourseId(extractConfig.getCourseCode());
-             * examFile.setOrgId(extractConfig.getOrgId());
-             * examFileService.deleteExamFile(examFile);
-             */
-            // 没有试卷结构导出设置
-            if (exportStructure == null) {
-                // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, 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,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, 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) {
-                // 上传机考JSON文件
-                uploadComputerTestFile(extractConfig, accessUser, examPaper);
-            }
-        }
-    }
-
-}

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

@@ -1,150 +0,0 @@
-package cn.com.qmth.examcloud.core.questions.service.export;
-
-import java.io.File;
-import java.util.List;
-
-import org.apache.commons.collections.CollectionUtils;
-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.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.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
- * @date 2018年6月2日 上午11:29:49
- * @company QMTH
- * @description 重庆大学导出、上传文件service
- */
-@Service("cqdxExportPaperService")
-public class CqdxExportPaperService extends ExportPaperAbstractService {
-
-    @Override
-    public void downloadPaper(Long rootOrgId, String paperId, String zipFileName, String examType) throws Exception {
-        PaperExp paperExp = super.initPaperExp(paperId);
-        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 directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
-            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,paperfileName, ExportTemplateType.PAPER_EXPORT);
-            // 下载音频
-            super.downloadAudio(paperExp, zipFileName);
-        }
-    }
-
-    @Override
-    public void downloadPaperAnswer(Long rootOrgId, String paperId, String zipFileName) throws Exception {
-        PaperExp paperExp = initPaperExp(paperId);
-        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 directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
-            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,answerFileName, ExportTemplateType.ANWSER_EXPORT);
-        }
-    }
-
-    /**
-     * 设置大题标题
-     */
-    @Override
-    public void setExportQuestionTitle(List<PaperDetailExp> details, boolean isWord) {
-        if (CollectionUtils.isEmpty(details)) {
-            return;
-        }
-
-        final String style = "<em class=\"e_num\">%s</em>";
-
-        for (PaperDetailExp detail : details) {
-            String perQuesScore = checkPaperDetailUnitScore(detail);
-            if (perQuesScore != null) {
-                perQuesScore = CommonUtils.clearZeroPoint(perQuesScore);
-                if (!isWord) {
-                    perQuesScore = String.format(style, perQuesScore);
-                }
-                perQuesScore = String.format("每小题%s分,", perQuesScore);
-            } else {
-                perQuesScore = "";// 每题分数不一致则不注明
-            }
-
-            QuesStructType type = detail.getPaperDetailUnits().get(0).getQuestionType();
-            String detailScore = CommonUtils.formatValue(detail.getScore());
-            String unitCount = String.valueOf(detail.getUnitCount());
-
-            if (!isWord) {
-                detailScore = String.format(style, detailScore);
-                unitCount = String.format(style, unitCount);
-            }
-            String title = String.format("(本大题共%s小题,%s共%s分)", unitCount, perQuesScore, detailScore);
-
-            if (type == QuesStructType.SINGLE_ANSWER_QUESTION) {
-                detail.setTitleDetail("在每小题列出的备选项中只有一个符合题目要求的,请将其选出并将“答题卡”的相应代码涂黑,错涂、多涂或未涂均无分");
-            } else if (type == QuesStructType.MULTIPLE_ANSWER_QUESTION) {
-                detail.setTitleDetail("在每小题列出的备选项中至少有两个符合题目要求,请将符合项选出并将“答题卡”的相应代码涂黑");
-            } else if (type == QuesStructType.BOOL_ANSWER_QUESTION) {
-                detail.setTitleDetail("正确的填涂√、错误填涂×。错涂、多涂或未涂均无分");
-            }
-
-            detail.setTitle(title);
-        }
-    }
-
-    @Override
-    public void uploadFile(ExtractConfig extractConfig, String paperId, ExportStructure exportStructure,
-            User accessUser, ExamPaper examPaper) throws Exception {
-        PaperExp paperExp = initPaperExp(paperId);
-        if (paperExp != null) {
-            String currNum = CommonUtils.getCurNum();
-            // 删除原有试卷文件
-            /*
-             * ExamFile examFile = new ExamFile();
-             * examFile.setExamId(extractConfig.getExamId()+"");
-             * examFile.setCourseId(extractConfig.getCourseCode());
-             * examFile.setOrgId(extractConfig.getOrgId());
-             * examFileService.deleteExamFile(examFile);
-             */
-            // 没有试卷结构导出设置
-            if (exportStructure == null) {
-                // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, 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,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, 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) {
-                // 上传机考JSON文件
-                uploadComputerTestFile(extractConfig, accessUser, examPaper);
-            }
-        }
-    }
-
-}

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

@@ -1,128 +0,0 @@
-/*
- * ************************************************* Copyright (c) 2019 QMTH.
- * All Rights Reserved. Created by Deason on 2019-07-31 13:54:07.
- * *************************************************
- */
-
-package cn.com.qmth.examcloud.core.questions.service.export;
-
-import java.io.File;
-import java.util.List;
-
-import org.springframework.stereotype.Service;
-
-import cn.com.qmth.examcloud.api.commons.security.bean.User;
-import cn.com.qmth.examcloud.commons.logging.ExamCloudLog;
-import cn.com.qmth.examcloud.commons.logging.ExamCloudLogFactory;
-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.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 QMTH
- * @date 2019-07-31
- */
-@Service("cugbExportPaperService")
-public class CugbExportPaperService extends ExportPaperAbstractService {
-
-    protected ExamCloudLog log = ExamCloudLogFactory.getLog(this.getClass());
-
-    @Override
-    public void downloadPaper(Long rootOrgId, String paperId, String zipFileName, String examType) throws Exception {
-        log.debug("题库开始下载试卷...");
-        long startTime = System.currentTimeMillis();
-        PaperExp paperExp = super.initPaperExp(paperId);
-        long paperExpTime = System.currentTimeMillis();
-        log.debug("拼装导出对象耗时:" + (paperExpTime - startTime) + "ms");
-        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));
-
-            long docxImgTime = System.currentTimeMillis();
-//            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");
-            // 下载音频
-            super.downloadAudio(paperExp, zipFileName);
-            long aduioTime = System.currentTimeMillis();
-            log.debug("处理音频耗时:" + (aduioTime - docxImgEndTime) + "ms");
-        }
-    }
-
-    @Override
-    public void downloadPaperAnswer(Long rootOrgId, String paperId, String zipFileName) throws Exception {
-        log.debug("题库开始下载答案...");
-        long startTime = System.currentTimeMillis();
-        PaperExp paperExp = initPaperExp(paperId);
-        long paperExpTime = System.currentTimeMillis();
-        log.debug("拼装导出对象耗时:" + (paperExpTime - startTime) + "ms");
-        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);
-            long docxTime = System.currentTimeMillis();
-//            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");
-        }
-    }
-
-    @Override
-    public void uploadFile(ExtractConfig extractConfig, String paperId, ExportStructure exportStructure,
-            User accessUser, ExamPaper examPaper) throws Exception {
-        PaperExp paperExp = initPaperExp(paperId);
-        if (paperExp != null) {
-            String currNum = CommonUtils.getCurNum();
-            // 删除原有试卷文件
-            /*
-             * ExamFile examFile = new ExamFile();
-             * examFile.setExamId(extractConfig.getExamId()+"");
-             * examFile.setCourseId(extractConfig.getCourseCode());
-             * examFile.setOrgId(extractConfig.getOrgId());
-             * examFileService.deleteExamFile(examFile);
-             */
-            // 没有试卷结构导出设置
-            if (exportStructure == null) {
-                // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, 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,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, 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) {
-                // 上传机考JSON文件
-                uploadComputerTestFile(extractConfig, accessUser, examPaper);
-            }
-        }
-    }
-
-}

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

@@ -1,102 +0,0 @@
-package cn.com.qmth.examcloud.core.questions.service.export;
-
-import java.io.File;
-import java.util.List;
-
-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.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.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
- * @date 2018年7月25日 上午11:29:49
- * @company QMTH
- * @description 东北师范大学导出、上传文件service
- */
-@Service("dbsfExportPaperService")
-public class DbsfExportPaperService extends ExportPaperAbstractService {
-
-    @Override
-    public void downloadPaper(Long rootOrgId, String paperId, String zipFileName, String examType) throws Exception {
-        PaperExp paperExp = super.initPaperExp(paperId);
-        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 directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
-            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,paperfileName, ExportTemplateType.PAPER_EXPORT);
-            // 下载音频
-            super.downloadAudio(paperExp, zipFileName);
-        }
-    }
-
-    @Override
-    public void downloadPaperAnswer(Long rootOrgId, String paperId, String zipFileName) throws Exception {
-        PaperExp paperExp = initPaperExp(paperId);
-        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 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 {
-        PaperExp paperExp = initPaperExp(paperId);
-        if (paperExp != null) {
-            String currNum = CommonUtils.getCurNum();
-            // 删除原有试卷文件
-            /*
-             * ExamFile examFile = new ExamFile();
-             * examFile.setExamId(extractConfig.getExamId()+"");
-             * examFile.setCourseId(extractConfig.getCourseCode());
-             * examFile.setOrgId(extractConfig.getOrgId());
-             * examFileService.deleteExamFile(examFile);
-             */
-            // 没有试卷结构导出设置
-            if (exportStructure == null) {
-                // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, 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,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, 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) {
-                // 上传机考JSON文件
-                uploadComputerTestFile(extractConfig, accessUser, examPaper);
-            }
-        }
-    }
-
-}

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

@@ -17,12 +17,14 @@ 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.enums.PaperSeqMode;
 import cn.com.qmth.examcloud.core.questions.base.question.enums.QuesStructType;
 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.Question;
 import cn.com.qmth.examcloud.core.questions.dao.entity.QuestionTypeNum;
+import cn.com.qmth.examcloud.core.questions.service.bean.dto.DownloadPaperDto;
 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;
@@ -37,33 +39,29 @@ import cn.com.qmth.examcloud.core.questions.service.util.ExportPaperUtil;
 @Service("dzkdExportPaperService")
 public class DzkdExportPaperService extends ExportPaperAbstractService {
 
-    public void downloadPaper(Long rootOrgId, String paperId, String zipFileName, String examType) throws Exception {
-        PaperExp paperExp = initPaperExp(paperId);
-        // 电子科大独有
-        setSplitPaperDetailExp(paperExp, paperExp.getPaperDetails());
+	@Override
+    public void downloadPaper(DownloadPaperDto dto) throws Exception {
+        PaperExp paperExp = initPaperExp(dto);
         if (paperExp != null) {
+        	// 电子科大独有
+        	setSplitPaperDetailExp(paperExp, paperExp.getPaperDetails());
             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 directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
-            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,paperfileName, ExportTemplateType.PAPER_EXPORT);
+            File directory = new File(TEMP_FILE_EXP + File.separator + dto.getZipFileName());
+            ExportPaperUtil.createPaperDocFile(dto.getRootOrgId(),paperExp, directory,paperfileName, ExportTemplateType.PAPER_EXPORT);
         }
     }
 
-    public void downloadPaperAnswer(Long rootOrgId, String paperId, String zipFileName) throws Exception {
-        PaperExp paperExp = initPaperExp(paperId);
+    @Override
+    public void downloadPaperAnswer(DownloadPaperDto dto) throws Exception {
+        PaperExp paperExp = initPaperExp(dto);
         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 directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
-            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,answerFileName, ExportTemplateType.ANWSER_EXPORT);
+            File directory = new File(TEMP_FILE_EXP + File.separator + dto.getZipFileName());
+            ExportPaperUtil.createPaperDocFile(dto.getRootOrgId(),paperExp, directory,answerFileName, ExportTemplateType.ANWSER_EXPORT);
         }
     }
 
@@ -311,8 +309,11 @@ public class DzkdExportPaperService extends ExportPaperAbstractService {
 
     @Override
     public void uploadFile(ExtractConfig extractConfig, String paperId, ExportStructure exportStructure,
-            User accessUser, ExamPaper examPaper) throws Exception {
-        PaperExp paperExp = initPaperExp(paperId);
+            User accessUser, ExamPaper examPaper,PaperSeqMode seqMode){
+    	DownloadPaperDto dto=new DownloadPaperDto();
+    	dto.setPaperId(paperId);
+    	dto.setSeqMode(seqMode);
+        PaperExp paperExp = initPaperExp(dto);
         setSplitPaperDetailExp(paperExp, paperExp.getPaperDetails());
         if (paperExp != null) {
             String currNum = CommonUtils.getCurNum();

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

@@ -24,6 +24,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Example;
+import org.springframework.stereotype.Service;
 
 import com.google.gson.Gson;
 
@@ -35,6 +36,8 @@ 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.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.enums.PaperSeqMode;
 import cn.com.qmth.examcloud.core.questions.base.excel.ExcelWriter;
 import cn.com.qmth.examcloud.core.questions.base.json.JsonImportUtil;
 import cn.com.qmth.examcloud.core.questions.base.question.enums.QuesStructType;
@@ -66,6 +69,7 @@ import cn.com.qmth.examcloud.core.questions.service.ExportTemplateService;
 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.DownloadPaperDto;
 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;
@@ -85,7 +89,8 @@ import freemarker.template.Template;
  * @company QMTH
  * @description 导出、上传文件service 父类
  */
-public abstract class ExportPaperAbstractService {
+@Service("exportPaperAbstractService")
+public class ExportPaperAbstractService {
 
     private static final Logger log = LoggerFactory.getLogger(ExportPaperAbstractService.class);
 
@@ -159,126 +164,6 @@ public abstract class ExportPaperAbstractService {
 
     protected static final String OFFLINE = "offLine";
 
-    // // 陕西师范模板
-    // protected static Template SXSF_TEMPLATE_PAPER;
-    //
-    // protected static Template SXSF_TEMPLATE_ANSWER;
-    //
-    // protected static Template SXSF_OUTLINE_TEMPLATE_PAPER;
-    //
-    // // 西南交通大学
-    // protected static Template XNJD_TEMPLATE_PAPER;
-    //
-    // protected static Template XNJD_TEMPLATE_ANSWER;
-    //
-    // protected static Template XNJD_OUTLINE_TEMPLATE_PAPER;
-    //
-    // // 电子科大模板
-    // protected static Template DZKD_TEMPLATE_PAPER;
-    //
-    // protected static Template DZKD_TEMPLATE_ANSWER;
-    //
-    // // 华中科技大学模板
-    // protected static Template HZKJ_TEMPLATE_PAPER;
-    //
-    // protected static Template HZKJ_TEMPLATE_ANSWER;
-    //
-    // // 山东大学
-    // protected static Template SDDX_TEMPLATE_PAPER;
-    //
-    // protected static Template SDDX_TEMPLATE_ANSWER;
-    //
-    // // 天津大学
-    // protected static Template TJDX_TEMPLATE_PAPER;
-    //
-    // protected static Template TJDX_TEMPLATE_ANSWER;
-    //
-    // protected static Template TJDX_OUTLINE_TEMPLATE_PAPER;
-    //
-    // // 石油大学模板
-    // protected static Template SYDX_TEMPLATE_PAPER;
-    //
-    // protected static Template SYDX_TEMPLATE_ANSWER;
-    //
-    // // 西安交大模板
-    // protected static Template XAJD_TEMPLATE_PAPER;
-    //
-    // protected static Template XAJD_TEMPLATE_ANSWER;
-    //
-    // // 武汉软件工程职业学院模板
-    // protected static Template RJGC_TMPLATE_PAPER;
-    //
-    // protected static Template RJGC_TMPLATE_ANSWER;
-    //
-    // // 北京师范模板
-    // protected static Template BJSF_TMPLATE_PAPER;
-    //
-    // protected static Template BJSF_TMPLATE_ANSWER;
-    //
-    // // 重庆大学
-    // protected static Template CQDX_TMPLATE_PAPER;
-    //
-    // protected static Template CQDX_TMPLATE_ANSWER;
-    //
-    // // 福建师范
-    // protected static Template FJSF_TMPLATE_PAPER;
-    //
-    // protected static Template FJSF_TMPLATE_ANSWER;
-    //
-    // // 中国地质大学(北京)
-    // protected static Template CUGB_TMPLATE_PAPER;
-    //
-    // protected static Template CUGB_TMPLATE_ANSWER;
-    //
-    // // 武汉市第二轻工业学校
-    // protected static Template WHEQX_TMPLATE_PAPER;
-    //
-    // protected static Template WHEQX_TMPLATE_ANSWER;
-    //
-    // // 华南师范
-    // protected static Template HNSF_TMPLATE_PAPER;
-    //
-    // protected static Template HNSF_TMPLATE_ANSWER;
-    //
-    // // 中国医科
-    // protected static Template YKDX_TMPLATE_PAPER;
-    //
-    // protected static Template YKDX_TMPLATE_ANSWER;
-    //
-    // // 北京交通大学
-    // protected static Template BJJT_TMPLATE_PAPER;
-    //
-    // protected static Template BJJT_TMPLATE_ANSWER;
-    //
-    // // 中国地质大学(武汉)
-    // protected static Template ZGDDW_TMPLATE_PAPER;
-    //
-    // protected static Template ZGDDW_TMPLATE_ANSWER;
-    //
-    // // 中国地质大学(北京)
-    // protected static Template ZGDDB_TMPLATE_PAPER;
-    //
-    // protected static Template ZGDDB_TMPLATE_ANSWER;
-    //
-    // // 东北师范大学
-    // protected static Template DBSF_TMPLATE_PAPER;
-    //
-    // protected static Template DBSF_TMPLATE_ANSWER;
-    //
-    // // 南开大学
-    // protected static Template NKDX_TMPLATE_PAPER;
-    //
-    // protected static Template NKDX_TMPLATE_ANSWER;
-    //
-    // // 北京航空航天大学
-    // protected static Template BJHK_TMPLATE_PAPER;
-    //
-    // protected static Template BJHK_TMPLATE_ANSWER;
-    //
-    // // 华东师范大学
-    // protected static Template FDSF_TMPLATE_PAPER;
-    //
-    // protected static Template FDSF_TMPLATE_ANSWER;
 
     // 原卷word A4 模板
     public final static Template ORIGINAL_PAPER;
@@ -301,133 +186,6 @@ public abstract class ExportPaperAbstractService {
         }
         ORIGINAL_PAPER = originalTemplate;
 
-        // try {
-        // SXSF_TEMPLATE_PAPER =
-        // CONFIGURATION.getTemplate("sxsf_paper_template.ftl", ENCODING);
-        // SXSF_TEMPLATE_ANSWER =
-        // CONFIGURATION.getTemplate("sxsf_answer_template.ftl", ENCODING);
-        // SXSF_OUTLINE_TEMPLATE_PAPER =
-        // CONFIGURATION.getTemplate("sxsf_outline_paper_template.ftl",
-        // ENCODING);
-        //
-        // DZKD_TEMPLATE_PAPER =
-        // CONFIGURATION.getTemplate("dzkd_paper_template.ftl", ENCODING);
-        // DZKD_TEMPLATE_ANSWER =
-        // CONFIGURATION.getTemplate("dzkd_answer_template.ftl", ENCODING);
-        //
-        // HZKJ_TEMPLATE_PAPER =
-        // CONFIGURATION.getTemplate("hzkj_paper_template.ftl", ENCODING);
-        // HZKJ_TEMPLATE_ANSWER =
-        // CONFIGURATION.getTemplate("hzkj_answer_template.ftl", ENCODING);
-        //
-        // SDDX_TEMPLATE_PAPER =
-        // CONFIGURATION.getTemplate("sddx_paper_template.ftl", ENCODING);
-        // SDDX_TEMPLATE_ANSWER =
-        // CONFIGURATION.getTemplate("sddx_answer_template.ftl", ENCODING);
-        //
-        // TJDX_TEMPLATE_PAPER =
-        // CONFIGURATION.getTemplate("tjdx_paper_template.ftl", ENCODING);
-        // TJDX_TEMPLATE_ANSWER =
-        // CONFIGURATION.getTemplate("tjdx_answer_template.ftl", ENCODING);
-        // TJDX_OUTLINE_TEMPLATE_PAPER =
-        // CONFIGURATION.getTemplate("tjdx_outline_paper_template.ftl",
-        // ENCODING);
-        //
-        // XNJD_TEMPLATE_PAPER =
-        // CONFIGURATION.getTemplate("xnjd_paper_template.ftl", ENCODING);
-        // XNJD_TEMPLATE_ANSWER =
-        // CONFIGURATION.getTemplate("xnjd_answer_template.ftl", ENCODING);
-        // XNJD_OUTLINE_TEMPLATE_PAPER =
-        // CONFIGURATION.getTemplate("xnjd_outline_paper_template.ftl",
-        // ENCODING);
-        //
-        // SYDX_TEMPLATE_PAPER =
-        // CONFIGURATION.getTemplate("sydx_paper_template.ftl", ENCODING);
-        // SYDX_TEMPLATE_ANSWER =
-        // CONFIGURATION.getTemplate("sydx_answer_template.ftl", ENCODING);
-        //
-        // XAJD_TEMPLATE_PAPER =
-        // CONFIGURATION.getTemplate("xajd_paper_template.ftl", ENCODING);
-        // XAJD_TEMPLATE_ANSWER =
-        // CONFIGURATION.getTemplate("xajd_answer_template.ftl", ENCODING);
-        //
-        // RJGC_TMPLATE_PAPER =
-        // CONFIGURATION.getTemplate("rjgc_paper_template.ftl", ENCODING);
-        // RJGC_TMPLATE_ANSWER =
-        // CONFIGURATION.getTemplate("rjgc_answer_template.ftl", ENCODING);
-        //
-        // BJSF_TMPLATE_PAPER =
-        // CONFIGURATION.getTemplate("bjsf_paper_template.ftl", ENCODING);
-        // BJSF_TMPLATE_ANSWER =
-        // CONFIGURATION.getTemplate("bjsf_answer_template.ftl", ENCODING);
-        //
-        // CQDX_TMPLATE_PAPER =
-        // CONFIGURATION.getTemplate("cqdx_paper_template.ftl", ENCODING);
-        // CQDX_TMPLATE_ANSWER =
-        // CONFIGURATION.getTemplate("cqdx_answer_template.ftl", ENCODING);
-        //
-        // FJSF_TMPLATE_PAPER =
-        // CONFIGURATION.getTemplate("fjsf_paper_template.ftl", ENCODING);
-        // FJSF_TMPLATE_ANSWER =
-        // CONFIGURATION.getTemplate("fjsf_answer_template.ftl", ENCODING);
-        //
-        // CUGB_TMPLATE_PAPER =
-        // CONFIGURATION.getTemplate("cugb_paper_template.ftl", ENCODING);
-        // CUGB_TMPLATE_ANSWER =
-        // CONFIGURATION.getTemplate("cugb_answer_template.ftl", ENCODING);
-        //
-        // WHEQX_TMPLATE_PAPER =
-        // CONFIGURATION.getTemplate("wheqx_paper_template.ftl", ENCODING);
-        // WHEQX_TMPLATE_ANSWER =
-        // CONFIGURATION.getTemplate("wheqx_answer_template.ftl", ENCODING);
-        //
-        // HNSF_TMPLATE_PAPER =
-        // CONFIGURATION.getTemplate("hnsf_paper_template.ftl", ENCODING);
-        // HNSF_TMPLATE_ANSWER =
-        // CONFIGURATION.getTemplate("hnsf_answer_template.ftl", ENCODING);
-        //
-        // YKDX_TMPLATE_PAPER =
-        // CONFIGURATION.getTemplate("ykdx_paper_template.ftl", ENCODING);
-        // YKDX_TMPLATE_ANSWER =
-        // CONFIGURATION.getTemplate("ykdx_answer_template.ftl", ENCODING);
-        //
-        // BJJT_TMPLATE_PAPER =
-        // CONFIGURATION.getTemplate("bjjt_paper_template.ftl", ENCODING);
-        // BJJT_TMPLATE_ANSWER =
-        // CONFIGURATION.getTemplate("bjjt_answer_template.ftl", ENCODING);
-        //
-        // ZGDDW_TMPLATE_PAPER =
-        // CONFIGURATION.getTemplate("zgddw_paper_template.ftl", ENCODING);
-        // ZGDDW_TMPLATE_ANSWER =
-        // CONFIGURATION.getTemplate("zgddw_answer_template.ftl", ENCODING);
-        //
-        // ZGDDB_TMPLATE_PAPER =
-        // CONFIGURATION.getTemplate("zgddb_paper_template.ftl", ENCODING);
-        // ZGDDB_TMPLATE_ANSWER =
-        // CONFIGURATION.getTemplate("zgddb_answer_template.ftl", ENCODING);
-        //
-        // DBSF_TMPLATE_PAPER =
-        // CONFIGURATION.getTemplate("dbsf_paper_template.ftl", ENCODING);
-        // DBSF_TMPLATE_ANSWER =
-        // CONFIGURATION.getTemplate("dbsf_answer_template.ftl", ENCODING);
-        //
-        // NKDX_TMPLATE_PAPER =
-        // CONFIGURATION.getTemplate("nkdx_paper_template.ftl", ENCODING);
-        // NKDX_TMPLATE_ANSWER =
-        // CONFIGURATION.getTemplate("nkdx_answer_template.ftl", ENCODING);
-        //
-        // BJHK_TMPLATE_PAPER =
-        // CONFIGURATION.getTemplate("bjhk_paper_template.ftl", ENCODING);
-        // BJHK_TMPLATE_ANSWER =
-        // CONFIGURATION.getTemplate("bjhk_answer_template.ftl", ENCODING);
-        //
-        // FDSF_TMPLATE_PAPER =
-        // CONFIGURATION.getTemplate("fdsf_paper_template.ftl", ENCODING);
-        // FDSF_TMPLATE_ANSWER =
-        // CONFIGURATION.getTemplate("fdsf_answer_template.ftl", ENCODING);
-        // } catch (Exception e) {
-        // log.error(e.getMessage(), e);
-        // }
     }
 
     /**
@@ -437,8 +195,26 @@ public abstract class ExportPaperAbstractService {
      * @param zipFileName
      * @throws Exception
      */
-    public abstract void downloadPaper(Long rootOrgId, String paperId, String zipFileName, String examType)
-            throws Exception;
+    public void downloadPaper(DownloadPaperDto dto) throws Exception {
+        PaperExp paperExp = initPaperExp(dto);
+        if (paperExp != null) {
+            String paperfileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
+                    + ExamFileType.PAPER.getName() + DOCX_SUFFIX;
+            File directory = new File(TEMP_FILE_EXP + File.separator + dto.getZipFileName());
+            if (OFFLINE.equals(dto.getExamType())) {
+                if (StringUtils.isBlank(paperExp.getExamRemark())) {
+                    paperExp.setExamRemark("<p></p>");
+                }
+
+                ExportPaperUtil.createPaperDocFile(dto.getRootOrgId(),paperExp, directory,paperfileName, ExportTemplateType.OUTLINE_PAPER_EXPORT);
+            } else {
+                ExportPaperUtil.createPaperDocFile(dto.getRootOrgId(),paperExp, directory,paperfileName, ExportTemplateType.PAPER_EXPORT);
+            }
+
+            // 下载音频
+            downloadAudio(paperExp, dto.getZipFileName());
+        }
+    }
 
     /**
      * 下载答案
@@ -447,7 +223,15 @@ public abstract class ExportPaperAbstractService {
      * @param zipFileName
      * @throws Exception
      */
-    public abstract void downloadPaperAnswer(Long rootOrgId, String paperId, String zipFileName) throws Exception;
+    public void downloadPaperAnswer(DownloadPaperDto dto) throws Exception {
+        PaperExp paperExp = initPaperExp(dto);
+        if (paperExp != null) {
+            String answerFileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
+                    + ExamFileType.ANSWER.getName() + DOCX_SUFFIX;
+            File directory = new File(TEMP_FILE_EXP + File.separator + dto.getZipFileName());
+            ExportPaperUtil.createPaperDocFile(dto.getRootOrgId(),paperExp, directory,answerFileName, ExportTemplateType.ANWSER_EXPORT);
+        }
+    }
 
     /**
      * 上传试卷相关文件
@@ -458,46 +242,41 @@ public abstract class ExportPaperAbstractService {
      * @param accessUser
      * @throws Exception
      */
-    public abstract void uploadFile(ExtractConfig extractConfig, String paperId, ExportStructure exportStructure,
-            User accessUser, ExamPaper examPaper) throws Exception;
+    public void uploadFile(ExtractConfig extractConfig, String paperId, ExportStructure exportStructure,
+            User accessUser, ExamPaper examPaper,PaperSeqMode seqMode){
+    	DownloadPaperDto dto=new DownloadPaperDto();
+    	dto.setPaperId(paperId);
+    	dto.setSeqMode(seqMode);
+        PaperExp paperExp = initPaperExp(dto);
+        if (paperExp != null) {
+            String currNum = CommonUtils.getCurNum();
+            // 没有试卷结构导出设置
+            if (exportStructure == null) {
+                // 上传试卷
+                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
+                        ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, 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,
+                        ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, 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) {
+                // 上传机考JSON文件
+                uploadComputerTestFile(extractConfig, accessUser, examPaper);
+            }
+        }
+    }
 
-    /**
-     * 设置选项号
-     *
-     * @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);
-    // 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
@@ -510,265 +289,6 @@ public abstract class ExportPaperAbstractService {
         return String.valueOf(optionNum);
     }
 
-    /**
-     * 替换填空 将###替换为下划线_______
-     *
-     * @param wordMl
-     * @param num
-     * @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();
-    // }
-
-    /**
-     * 设置题号
-     *
-     * @param quesBodyWordMl
-     * @param num
-     * @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();
-    // }
-
-    /**
-     * 处理Word的题干选项 1.设置题号 2.给小题选项进行排序 3.设置选项号 4.替换题干中的##为____
-     */
-    // public void setQuestionNumberForWord(List<PaperDetailExp> details) throws
-    // Exception {
-    // if (CollectionUtils.isEmpty(details)) {
-    // return;
-    // }
-    //
-    // for (PaperDetailExp detail : details) {
-    // List<PaperDetailUnitExp> units = detail.getPaperDetailUnits();
-    // for (PaperDetailUnitExp unit : units) {
-    // Question question = unit.getQuestion();
-    //
-    // // 定义一个字段,用来判断是否为选择题
-    // boolean isOption = false;
-    // List<QuesOption> options = question.getQuesOptions();
-    // if (CollectionUtils.isNotEmpty(options)) {
-    // isOption = true;
-    // int index = 0;
-    // for (QuesOption option : options) {
-    // option.setOptionBodyWord(setOptionNum(option.getOptionBodyWord(),
-    // getOptionNum(index)));
-    // index++;
-    // }
-    // }
-    //
-    // if (isOption) {
-    // // 检测选项是否换行
-    // int i = optionLine(options);
-    // if (i == 4) {
-    // optionListFourline(options);
-    // }
-    // if (i == 2) {
-    // optionListTwoline(options);
-    // }
-    // }
-    //
-    // List<Question> subQuestions = question.getSubQuestions();
-    // if (CollectionUtils.isNotEmpty(subQuestions)) {
-    // // 套题主题干
-    // question.setQuesBodyWord(
-    // replaceQuesBlank(question.getQuesBodyWord(),
-    // subQuestions.get(0).getNumber()));
-    //
-    // for (Question subQues : subQuestions) {
-    // // 处理子题题干,答案
-    // subQues.setQuesBodyWord(setSubQuesNum(subQues.getQuesBodyWord(),
-    // subQues.getNumber()));
-    // subQues.setQuesAnswerWord(setSubQuesNum(subQues.getQuesAnswerWord(),
-    // subQues.getNumber()));
-    // subQues.setQuesBodyWord(replaceQuesBlank(subQues.getQuesBodyWord(),
-    // subQues.getNumber()));
-    //
-    // List<QuesOption> subOptions = subQues.getQuesOptions();
-    // if (CollectionUtils.isNotEmpty(subOptions)) {
-    // int subIndex = 0;
-    // for (QuesOption subOption : subOptions) {
-    // subOption.setOptionBodyWord(
-    // setOptionNum(subOption.getOptionBodyWord(), getOptionNum(subIndex)));
-    // subIndex++;
-    // }
-    //
-    // // 检测选项是否换行
-    // int i = optionLine(subOptions);
-    // if (i == 4) {
-    // optionListFourline(subOptions);
-    // }
-    // if (i == 2) {
-    // optionListTwoline(subOptions);
-    // }
-    // }
-    // }
-    // } else {
-    // // 处理非套题题干、答案
-    // question.setQuesBodyWord(setSubQuesNum(question.getQuesBodyWord(),
-    // unit.getNumber()));
-    // question.setQuesAnswerWord(setSubQuesNum(question.getQuesAnswerWord(),
-    // unit.getNumber()));
-    //
-    // question.setQuesBodyWord(replaceQuesBlank(question.getQuesBodyWord(),
-    // unit.getNumber()));
-    // }
-    // }
-    // }
-    // }
-
-    /**
-     * 检测同一行可以放多少个选项
-     *
-     * @param optionList
-     * @return
-     * @throws Exception
-     */
-    // private int optionLine(List<QuesOption> optionList) throws Exception {
-    // int four = 0;
-    // String tmpText = "";
-    // for (int i = 0; i < optionList.size(); i++) {
-    // QuesOption quesOption = optionList.get(i);
-    // List<Object> pList = getPlist(quesOption);
-    // if (pList == null || pList.size() == 0) {
-    // four++;
-    // continue;
-    // }
-    // // 判断是否为纯文本
-    // boolean isText = DocxProcessUtil.isText((P) pList.get(0));
-    // if (isText) {
-    // tmpText = DocxProcessUtil.getPText((P) pList.get(0));
-    // // 如果四个选项在同一行,长度不能超过64
-    // if (optionsLength(tmpText) < 18) {
-    // four++;
-    // } else if (optionsLength(tmpText) < 42) {
-    // // 什么都不做
-    // } else {
-    // return 1;
-    // }
-    // } else {
-    // return 1;
-    // }
-    // }
-    // if (four == optionList.size()) {
-    // return 4;
-    // } else {
-    // return 2;
-    // }
-    // }
-
-    /**
-     * 根据选项得到选项段落
-     *
-     * @param quesOption
-     * @return
-     * @throws Exception
-     */
-    // private List<Object> getPlist(QuesOption quesOption) throws Exception {
-    // String optionBodyWordMl = quesOption.getOptionBodyWord();
-    // String tmpStr = DocxProcessUtil.BODY_HEADER + optionBodyWordMl +
-    // DocxProcessUtil.BODY_TAIL;
-    // Body body = (Body) XmlUtils.unmarshalString(tmpStr, Context.jc,
-    // Body.class);
-    // List<Object> pList = body.getContent();
-    // return pList;
-    // }
 
     /**
      * 计算选项长度
@@ -782,175 +302,6 @@ public abstract class ExportPaperAbstractService {
         return term.length();
     }
 
-    /**
-     * 两个选项在同一行
-     *
-     * @param optionList
-     * @throws Exception
-     */
-    // public void optionListTwoline(List<QuesOption> optionList) throws
-    // Exception {
-    // for (int i = 0; i < optionList.size(); i++) {
-    // QuesOption quesOption = optionList.get(i);
-    // String optionBodyWordMl = quesOption.getOptionBodyWord();
-    // String tmpStr = DocxProcessUtil.BODY_HEADER + optionBodyWordMl +
-    // DocxProcessUtil.BODY_TAIL;
-    // Body body = (Body) XmlUtils.unmarshalString(tmpStr, Context.jc,
-    // Body.class);
-    // List<Object> pList = body.getContent();
-    // // 首选项添加tabs标签
-    // if (i % 2 == 0) {
-    // if (pList.size() > 0) {
-    // P p = (P) pList.get(0);
-    // // 添加tabs标签
-    // addTabs(p, 1);
-    // StringBuffer pWordMl = new StringBuffer();
-    // for (Object pObj : pList) {
-    // if (pObj instanceof P) {
-    // pWordMl.append(DocxProcessUtil.formatPWordMl(XmlUtils.marshaltoString(pObj)));
-    // }
-    // }
-    // quesOption.setOptionBodyWord(pWordMl.toString());
-    // }
-    // } else {
-    // if (pList.size() > 0) {
-    // String tmpText = DocxProcessUtil.getPText((P) pList.get(0));
-    // optionMerge(optionList.get((i / 2) * 2), tmpText, true);
-    // quesOption.setOptionBodyWord("");
-    // }
-    // }
-    // }
-    // }
-
-    /**
-     * 四个选项在同一行
-     */
-    // public void optionListFourline(List<QuesOption> optionList) throws
-    // Exception {
-    // for (int i = 0; i < optionList.size(); i++) {
-    // Boolean isAddTbale = false;
-    // QuesOption quesOption = optionList.get(i);
-    // String optionBodyWordMl = quesOption.getOptionBodyWord();
-    // String tmpStr = DocxProcessUtil.BODY_HEADER + optionBodyWordMl +
-    // DocxProcessUtil.BODY_TAIL;
-    // Body body = (Body) XmlUtils.unmarshalString(tmpStr, Context.jc,
-    // Body.class);
-    // List<Object> pList = body.getContent();
-    // P p = null;
-    // if (pList == null || pList.size() == 0) {
-    // p = new P();
-    // } else {
-    // p = (P) pList.get(0);
-    // }
-    // // 首选项添加tabs标签
-    // if (i % 4 == 0) {
-    // isAddTbale = true;
-    // // 添加tabs标签
-    // addTabs(p, 3);
-    // StringBuffer pWordMl = new StringBuffer();
-    // for (Object pObj : pList) {
-    // if (pObj instanceof P) {
-    // pWordMl.append(DocxProcessUtil.formatPWordMl(XmlUtils.marshaltoString(pObj)));
-    // }
-    // }
-    // quesOption.setOptionBodyWord(pWordMl.toString());
-    // } else {
-    // String tmpText = DocxProcessUtil.getPText(p);
-    // if ((i + 1) % 4 == 0) {
-    // isAddTbale = true;
-    // }
-    // optionMerge(optionList.get((i / 4) * 4), tmpText, isAddTbale);
-    // quesOption.setOptionBodyWord("");
-    // }
-    // }
-    // }
-
-    /**
-     * 在p标签中添加tabs标签
-     *
-     * @param p
-     */
-    // public void addTabs(P p, int tabNumbers) {
-    // // 添加tabs标签
-    // PPr pPr = p.getPPr();
-    // if (pPr == null) {
-    // pPr = new PPr();
-    // p.getContent().add(0, pPr);
-    // }
-    // Tabs tabs = new Tabs();
-    // if (tabNumbers == 3) {
-    // // 添加tabs
-    // CTTabStop tab1 = new CTTabStop();
-    // tab1.setVal(STTabJc.LEFT);
-    // tab1.setPos(BigInteger.valueOf(2268));
-    // CTTabStop tab2 = new CTTabStop();
-    // tab2.setVal(STTabJc.LEFT);
-    // tab2.setPos(BigInteger.valueOf(4536));
-    // CTTabStop tab3 = new CTTabStop();
-    // tab3.setVal(STTabJc.LEFT);
-    // tab3.setPos(BigInteger.valueOf(7230));
-    // tabs.getTab().add(tab1);
-    // tabs.getTab().add(tab2);
-    // tabs.getTab().add(tab3);
-    // } else {
-    // CTTabStop tab1 = new CTTabStop();
-    // tab1.setVal(STTabJc.LEFT);
-    // tab1.setPos(BigInteger.valueOf(4536));
-    // tabs.getTab().add(tab1);
-    // }
-    // pPr.setTabs(tabs);
-    // List<Object> pContent = p.getContent();
-    // addTab(pContent);
-    // }
-    //
-    // /**
-    // * 每行添加tab标签
-    // *
-    // * @param content
-    // */
-    // public void addTab(List<Object> content) {
-    // R run = new R();
-    // R.Tab tab = new R.Tab();
-    // run.getContent().add(tab);
-    // content.add(run);
-    // }
-
-    /**
-     * 选项合并
-     *
-     * @param tmpText
-     * @param isLast
-     * @throws Exception
-     */
-    // public void optionMerge(QuesOption option, String tmpText, Boolean
-    // isLast) throws Exception {
-    // String optionBodyWordMl = option.getOptionBodyWord();
-    // String tmpStr = DocxProcessUtil.BODY_HEADER + optionBodyWordMl +
-    // DocxProcessUtil.BODY_TAIL;
-    // Body body = (Body) XmlUtils.unmarshalString(tmpStr, Context.jc,
-    // Body.class);
-    // List<Object> pList = body.getContent();
-    // if (pList.size() > 0) {
-    // P p = (P) pList.get(pList.size() - 1);
-    // List<Object> pContent = p.getContent();
-    // R run = new R();
-    // Text text = new Text();
-    // text.setValue(tmpText);
-    // run.getContent().add(text);
-    // pContent.add(run);
-    // // 每个选项添加tab结束标签
-    // if (!isLast) {
-    // addTab(pContent);
-    // }
-    // }
-    // StringBuffer pWordMl = new StringBuffer();
-    // for (Object pObj : pList) {
-    // if (pObj instanceof P) {
-    // pWordMl.append(DocxProcessUtil.formatPWordMl(XmlUtils.marshaltoString(pObj)));
-    // }
-    // }
-    // option.setOptionBodyWord(pWordMl.toString());
-    // }
 
     /**
      * 设置大题标题
@@ -1003,8 +354,7 @@ public abstract class ExportPaperAbstractService {
      * @param accessUser
      * @throws IOException
      */
-    protected void uploadComputerTestFile(ExtractConfig extractConfig, User accessUser, ExamPaper examPaper)
-            throws IOException {
+    protected void uploadComputerTestFile(ExtractConfig extractConfig, User accessUser, ExamPaper examPaper){
         List<ComputerTestPaper> computerTestPaperList = buildComputerTestJsonService
                 .buildComputerTestPapers(extractConfig);
         String currentTimeStr = CommonUtils.getCurNum();
@@ -1505,31 +855,6 @@ public abstract class ExportPaperAbstractService {
         }
     }
 
-    /**
-     * 获取当前试卷下所有试题WordPkg
-     *
-     * @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);
-    // }
 
     /**
      * 筛选出试卷类型
@@ -1633,11 +958,11 @@ public abstract class ExportPaperAbstractService {
     /*
      * 用于导出Word试卷和试卷答案
      */
-    public PaperExp initPaperExp(String paperId) throws Exception {
-        PaperExp exportPaper = initPaperExpService.initPaperExp(paperId);
+    public PaperExp initPaperExp(DownloadPaperDto dto){
+        PaperExp exportPaper = initPaperExpService.initPaperExp(dto);
 
         // 给新的大题下所有小题排序
-        sortPaperDetailUnits(exportPaper.getPaperDetails());
+//        sortPaperDetailUnits(exportPaper.getPaperDetails());
 
         // 如果每个小题分数不一样,题干后面添加分数
         setQuestionScore(exportPaper.getPaperDetails(), true);
@@ -1654,10 +979,12 @@ public abstract class ExportPaperAbstractService {
      * 用于页面上预览PDF试卷
      */
     public PaperExp previewPaperForPDF(Paper paper) {
-        PaperExp previewPaper = initPaperExpService.initPaperExp(paper);
+    	DownloadPaperDto dto=new DownloadPaperDto();
+    	dto.setSeqMode(PaperSeqMode.MODE3);
+        PaperExp previewPaper = initPaperExpService.initPaperExp(paper,dto);
 
         // 给新的大题下所有小题排序
-        sortPaperDetailUnits(previewPaper.getPaperDetails());
+//        sortPaperDetailUnits(previewPaper.getPaperDetails());
 
         // 如果每个小题分数不一致,题干后面添加分数;一致时则不用加
         setQuestionScore(previewPaper.getPaperDetails(), false);
@@ -1728,57 +1055,6 @@ public abstract class ExportPaperAbstractService {
         }
     }
 
-    /**
-     * 题干上设置分数内容(Word)
-     */
-    // public String appendScoreToQuestionWordBody(String wordStr, double score)
-    // {
-    // String totalScore =
-    // BigDecimal.valueOf(score).stripTrailingZeros().toPlainString();
-    // String scores = CommonUtils.clearZeroPoint(totalScore);
-    //
-    // String tmpStr = DocxProcessUtil.BODY_HEADER + wordStr +
-    // DocxProcessUtil.BODY_TAIL;
-    // Body body;
-    // try {
-    // body = (Body) XmlUtils.unmarshalString(tmpStr, Context.jc, Body.class);
-    // } catch (Exception e) {
-    // log.error(e.getMessage());
-    // throw new StatusException("500", "Word解析异常!");
-    // }
-    //
-    // List<Object> pList = body.getContent();
-    // int index = 0;
-    // for (Object pObj : pList) {
-    // if (index == pList.size() - 1) {
-    // List<Object> pContent = ((P) pObj).getContent();
-    //
-    // R run = new R();
-    // Text text = new Text();
-    // text.setValue("(" + scores + "分)");
-    // run.getContent().add(text);
-    // pContent.add(run);
-    // }
-    // index++;
-    // }
-    //
-    // StringBuffer pWord = new StringBuffer();
-    // for (Object pObj : pList) {
-    // if (pObj instanceof P) {
-    // String value;
-    // try {
-    // value = DocxProcessUtil.formatPWordMl(XmlUtils.marshaltoString(pObj));
-    // } catch (Exception e) {
-    // log.error(e.getMessage());
-    // throw new StatusException("500", "Word解析异常!");
-    // }
-    //
-    // pWord.append(value);
-    // }
-    // }
-    //
-    // return pWord.toString();
-    // }
 
     /**
      * 题干上设置分数内容(Html)
@@ -1934,41 +1210,5 @@ public abstract class ExportPaperAbstractService {
         return CommonUtils.relaceQuestionIdx(str, 0);
     }
 
-    // public 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 =
-    // PropertyHolder.getString("examcloud.web.sys.tempDataDir");
-    // File dir = new File(temPath + File.separator + rootOrgId +
-    // File.separator);
-    // try {
-    // config.setDirectoryForTemplateLoading(dir);
-    // configs.put(rootOrgId, config);
-    // } catch (IOException e) {
-    // throw new StatusException("10001", "模板配置初始化出错 " + e.getMessage());
-    // }
-    // }
-    // return config;
-    // }
-    //
-    // public 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("20002", "获取模板出错 " + e.getMessage());
-    // }
-    // }
-    // return temp;
-    // }
 
 }

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

@@ -1,126 +0,0 @@
-/*
- * ************************************************* Copyright (c) 2019 QMTH.
- * All Rights Reserved. Created by Deason on 2019-05-15 16:06:29.
- * *************************************************
- */
-
-package cn.com.qmth.examcloud.core.questions.service.export;
-
-import java.io.File;
-import java.util.List;
-
-import org.springframework.stereotype.Service;
-
-import cn.com.qmth.examcloud.api.commons.security.bean.User;
-import cn.com.qmth.examcloud.commons.logging.ExamCloudLog;
-import cn.com.qmth.examcloud.commons.logging.ExamCloudLogFactory;
-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.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("fdsfExportPaperService")
-public class FdsfExportPaperService extends ExportPaperAbstractService {
-
-    protected ExamCloudLog log = ExamCloudLogFactory.getLog(this.getClass());
-
-    @Override
-    public void downloadPaper(Long rootOrgId, String paperId, String zipFileName, String examType) throws Exception {
-        log.debug("题库开始下载试卷...");
-        long startTime = System.currentTimeMillis();
-        PaperExp paperExp = super.initPaperExp(paperId);
-        long paperExpTime = System.currentTimeMillis();
-        log.debug("拼装导出对象耗时:" + (paperExpTime - startTime) + "ms");
-        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));
-
-            long docxImgTime = System.currentTimeMillis();
-//            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");
-            // 下载音频
-            super.downloadAudio(paperExp, zipFileName);
-            long aduioTime = System.currentTimeMillis();
-            log.debug("处理音频耗时:" + (aduioTime - docxImgEndTime) + "ms");
-        }
-    }
-
-    @Override
-    public void downloadPaperAnswer(Long rootOrgId, String paperId, String zipFileName) throws Exception {
-        log.debug("题库开始下载答案...");
-        long startTime = System.currentTimeMillis();
-        PaperExp paperExp = initPaperExp(paperId);
-        long paperExpTime = System.currentTimeMillis();
-        log.debug("拼装导出对象耗时:" + (paperExpTime - startTime) + "ms");
-        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);
-            long docxTime = System.currentTimeMillis();
-//            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");
-        }
-    }
-
-    @Override
-    public void uploadFile(ExtractConfig extractConfig, String paperId, ExportStructure exportStructure,
-            User accessUser, ExamPaper examPaper) throws Exception {
-        PaperExp paperExp = initPaperExp(paperId);
-        if (paperExp != null) {
-            String currNum = CommonUtils.getCurNum();
-            // 删除原有试卷文件
-            /*
-             * ExamFile examFile = new ExamFile();
-             * examFile.setExamId(extractConfig.getExamId()+"");
-             * examFile.setCourseId(extractConfig.getCourseCode());
-             * examFile.setOrgId(extractConfig.getOrgId());
-             * examFileService.deleteExamFile(examFile);
-             */
-            // 没有试卷结构导出设置
-            if (exportStructure == null) {
-                // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, 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,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, 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) {
-                // 上传机考JSON文件
-                uploadComputerTestFile(extractConfig, accessUser, examPaper);
-            }
-        }
-    }
-
-}

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

@@ -1,123 +0,0 @@
-package cn.com.qmth.examcloud.core.questions.service.export;
-
-import java.io.File;
-import java.util.List;
-
-import org.springframework.stereotype.Service;
-
-import cn.com.qmth.examcloud.api.commons.security.bean.User;
-import cn.com.qmth.examcloud.commons.logging.ExamCloudLog;
-import cn.com.qmth.examcloud.commons.logging.ExamCloudLogFactory;
-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.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
- * @date 2018年6月2日 上午11:29:49
- * @company QMTH
- * @description 福建师范大学导出、上传文件service
- */
-@Service("fjsfExportPaperService")
-public class FjsfExportPaperService extends ExportPaperAbstractService {
-
-    protected ExamCloudLog log = ExamCloudLogFactory.getLog(this.getClass());
-
-    @Override
-    public void downloadPaper(Long rootOrgId, String paperId, String zipFileName, String examType) throws Exception {
-        log.debug("题库开始下载试卷...");
-        long startTime = System.currentTimeMillis();
-        PaperExp paperExp = super.initPaperExp(paperId);
-        long paperExpTime = System.currentTimeMillis();
-        log.debug("拼装导出对象耗时:" + (paperExpTime - startTime) + "ms");
-        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));
-
-            long docxImgTime = System.currentTimeMillis();
-//            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");
-            // 下载音频
-            super.downloadAudio(paperExp, zipFileName);
-            long aduioTime = System.currentTimeMillis();
-            log.debug("处理音频耗时:" + (aduioTime - docxImgEndTime) + "ms");
-        }
-    }
-
-    @Override
-    public void downloadPaperAnswer(Long rootOrgId, String paperId, String zipFileName) throws Exception {
-        log.debug("题库开始下载答案...");
-        long startTime = System.currentTimeMillis();
-        PaperExp paperExp = initPaperExp(paperId);
-        long paperExpTime = System.currentTimeMillis();
-        log.debug("拼装导出对象耗时:" + (paperExpTime - startTime) + "ms");
-        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);
-            long docxTime = System.currentTimeMillis();
-//            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");
-        }
-    }
-
-    @Override
-    public void uploadFile(ExtractConfig extractConfig, String paperId, ExportStructure exportStructure,
-            User accessUser, ExamPaper examPaper) throws Exception {
-        PaperExp paperExp = initPaperExp(paperId);
-        if (paperExp != null) {
-            String currNum = CommonUtils.getCurNum();
-            // 删除原有试卷文件
-            /*
-             * ExamFile examFile = new ExamFile();
-             * examFile.setExamId(extractConfig.getExamId()+"");
-             * examFile.setCourseId(extractConfig.getCourseCode());
-             * examFile.setOrgId(extractConfig.getOrgId());
-             * examFileService.deleteExamFile(examFile);
-             */
-            // 没有试卷结构导出设置
-            if (exportStructure == null) {
-                // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, 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,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, 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) {
-                // 上传机考JSON文件
-                uploadComputerTestFile(extractConfig, accessUser, examPaper);
-            }
-        }
-    }
-
-}

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

@@ -1,91 +0,0 @@
-package cn.com.qmth.examcloud.core.questions.service.export;
-
-import java.io.File;
-import java.util.List;
-
-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.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.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 {
-
-    @Override
-    public void downloadPaper(Long rootOrgId, String paperId, String zipFileName, String examType) throws Exception {
-        PaperExp paperExp = super.initPaperExp(paperId);
-        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 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 = initPaperExp(paperId);
-        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 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 {
-        PaperExp paperExp = initPaperExp(paperId);
-        if (paperExp != null) {
-            String currNum = CommonUtils.getCurNum();
-            // 删除原有试卷文件
-            /*
-             * ExamFile examFile = new ExamFile();
-             * examFile.setExamId(extractConfig.getExamId()+"");
-             * examFile.setCourseId(extractConfig.getCourseCode());
-             * examFile.setOrgId(extractConfig.getOrgId());
-             * examFileService.deleteExamFile(examFile);
-             */
-            // 没有试卷结构导出设置
-            if (exportStructure == null) {
-                // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, 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,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, 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) {
-                // 上传机考JSON文件
-                uploadComputerTestFile(extractConfig, accessUser, examPaper);
-            }
-        }
-    }
-
-}

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

@@ -6,16 +6,11 @@ import java.util.List;
 import org.apache.commons.collections.CollectionUtils;
 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.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.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.DownloadPaperDto;
 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;
@@ -30,62 +25,18 @@ import cn.com.qmth.examcloud.core.questions.service.util.ExportPaperUtil;
 public class HzkjExportPaperService extends ExportPaperAbstractService {
 
     @Override
-    public void downloadPaper(Long rootOrgId, String paperId, String zipFileName, String examTpye) throws Exception {
-        PaperExp paperExp = initPaperExp(paperId);
-        setExportQuestionTitle(paperExp.getPaperDetails(), true);
+    public void downloadPaper(DownloadPaperDto dto) throws Exception {
+        PaperExp paperExp = initPaperExp(dto);
         if (paperExp != null) {
+        	setExportQuestionTitle(paperExp.getPaperDetails(), true);
             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 directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
-            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,paperfileName, ExportTemplateType.PAPER_EXPORT);
+            File directory = new File(TEMP_FILE_EXP + File.separator + dto.getZipFileName());
+            ExportPaperUtil.createPaperDocFile(dto.getRootOrgId(),paperExp, directory,paperfileName, ExportTemplateType.PAPER_EXPORT);
         }
     }
 
-    @Override
-    public void downloadPaperAnswer(Long rootOrgId, String paperId, String zipFileName) throws Exception {
-        PaperExp paperExp = initPaperExp(paperId);
-        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 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 {
-        PaperExp paperExp = initPaperExp(paperId);
-        if (paperExp != null) {
-            String currNum = CommonUtils.getCurNum();
-            // 没有试卷结构导出设置
-            if (exportStructure == null) {
-                // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, 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,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, 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) {
-                // 上传机考JSON文件
-                uploadComputerTestFile(extractConfig, accessUser, examPaper);
-            }
-        }
-    }
 
     @Override
     public void setExportQuestionTitle(List<PaperDetailExp> details, boolean isWord) {

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

@@ -1,8 +1,6 @@
 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;
@@ -29,10 +27,12 @@ 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.PaperService;
+import cn.com.qmth.examcloud.core.questions.service.bean.dto.DownloadPaperDto;
 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.impl.CourseService;
+import cn.com.qmth.examcloud.core.questions.service.util.PaperUtil;
 
 
 /**
@@ -58,11 +58,6 @@ public class InitPaperExpService {
     @Autowired
     ExamFileService examFileService;
 
-//    @Autowired
-//    private PaperDetailService paperDetailService;
-//
-//    @Autowired
-//    private QuestionAudioService questionAudioService;
 
     @Autowired
     QuesRepo quesRepo;
@@ -98,15 +93,15 @@ public class InitPaperExpService {
     /**
      * 根据paper得到导出试卷对象PaperExp
      */
-    public PaperExp initPaperExp(String paperId) {
-        Paper paper = Model.of(paperRepo.findById(paperId));
-        return this.initPaperExp(paper);
+    public PaperExp initPaperExp(DownloadPaperDto dto) {
+        Paper paper = Model.of(paperRepo.findById(dto.getPaperId()));
+        return this.initPaperExp(paper,dto);
     }
 
     /**
      * 根据paper得到导出试卷对象PaperExp
      */
-    public PaperExp initPaperExp(Paper paper) {
+    public PaperExp initPaperExp(Paper paper,DownloadPaperDto dto) {
         if (paper == null) {
             throw new StatusException("500", "该试卷不存在!");
         }
@@ -126,8 +121,10 @@ public class InitPaperExpService {
         List<PaperDetail> paperDetails = paperDetailRepo.findByPaperOrderByNumber(paper);
         //生成新的大题对象集合,加添对应的小题
         List<PaperDetailExp> paperDetailExps = separatePaperDetailUntils(paperDetails, paperExpDto);
-        //给新的大题集合排序,计算小题数量
-        sortPaperDetailExps(paperDetailExps);
+        //设置小题题序号
+        PaperUtil.setQuestionSeq(paperDetailExps, dto.getSeqMode());
+        //计算小题数量
+        setPaperDetailExpsSeq(paperDetailExps);
         //给新的大题添加分数
         scorePaperDetailExps(paperDetailExps);
 
@@ -204,25 +201,7 @@ public class InitPaperExpService {
         }
         return paperDetailExps;
     }
-
-    /**
-     * 大题序号重排,计算小题数量
-     *
-     * @param paperDetailExps
-     */
-    private void sortPaperDetailExps(List<PaperDetailExp> paperDetailExps) {
-        Collections.sort(paperDetailExps, new Comparator<PaperDetailExp>() {
-            @Override
-            public int compare(PaperDetailExp o1, PaperDetailExp o2) {
-                if (o1.getSortNumber() > o2.getSortNumber()) {
-                    return 1;
-                }
-                if (o1.getSortNumber().equals(o2.getSortNumber())) {
-                    return 0;
-                }
-                return -1;
-            }
-        });
+    private void setPaperDetailExpsSeq(List<PaperDetailExp> paperDetailExps) {
 
         if (paperDetailExps != null && paperDetailExps.size() > 0) {
             //循环所有大题,给大题排序

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

@@ -1,124 +0,0 @@
-package cn.com.qmth.examcloud.core.questions.service.export;
-
-import java.io.File;
-import java.util.List;
-
-import org.springframework.stereotype.Service;
-
-import cn.com.qmth.examcloud.api.commons.security.bean.User;
-import cn.com.qmth.examcloud.commons.logging.ExamCloudLog;
-import cn.com.qmth.examcloud.commons.logging.ExamCloudLogFactory;
-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.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
- * @date 2018年7月26日 上午11:29:49
- * @company QMTH
- * @description 南开大学导出、上传文件service
- */
-@Service("nkdxExportPaperService")
-public class NkdxExportPaperService extends ExportPaperAbstractService {
-
-    protected ExamCloudLog log = ExamCloudLogFactory.getLog(this.getClass());
-
-    @Override
-    public void downloadPaper(Long rootOrgId, String paperId, String zipFileName, String examType) throws Exception {
-        log.debug("题库开始下载试卷...");
-        long startTime = System.currentTimeMillis();
-        PaperExp paperExp = super.initPaperExp(paperId);
-        long paperExpTime = System.currentTimeMillis();
-        log.debug("拼装导出对象耗时:" + (paperExpTime - startTime) + "ms");
-        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));
-
-            long docxImgTime = System.currentTimeMillis();
-//            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");
-            // 下载音频
-            super.downloadAudio(paperExp, zipFileName);
-            long aduioTime = System.currentTimeMillis();
-            log.debug("处理音频耗时:" + (aduioTime - docxImgEndTime) + "ms");
-        }
-    }
-
-    @Override
-    public void downloadPaperAnswer(Long rootOrgId, String paperId, String zipFileName) throws Exception {
-        log.debug("题库开始下载答案...");
-        long startTime = System.currentTimeMillis();
-        PaperExp paperExp = initPaperExp(paperId);
-        long paperExpTime = System.currentTimeMillis();
-        log.debug("拼装导出对象耗时:" + (paperExpTime - startTime) + "ms");
-        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);
-            long docxTime = System.currentTimeMillis();
-//            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");
-        }
-    }
-
-    @Override
-    public void uploadFile(ExtractConfig extractConfig, String paperId, ExportStructure exportStructure,
-            User accessUser, ExamPaper examPaper) throws Exception {
-        PaperExp paperExp = initPaperExp(paperId);
-        if (paperExp != null) {
-            String currNum = CommonUtils.getCurNum();
-            // 删除原有试卷文件
-            /*
-             * ExamFile examFile = new ExamFile();
-             * examFile.setExamId(extractConfig.getExamId()+"");
-             * examFile.setCourseId(extractConfig.getCourseCode());
-             * examFile.setOrgId(extractConfig.getOrgId());
-             * examFileService.deleteExamFile(examFile);
-             */
-            // 没有试卷结构导出设置
-            if (exportStructure == null) {
-                // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, 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,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, 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) {
-                // 上传机考JSON文件
-                uploadComputerTestFile(extractConfig, accessUser, examPaper);
-            }
-        }
-    }
-
-}

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

@@ -1,94 +0,0 @@
-package cn.com.qmth.examcloud.core.questions.service.export;
-
-import java.io.File;
-import java.util.List;
-
-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.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.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
- * @date 2018.3.6
- * @description 武汉软件工程职业学院
- * @company qmth
- */
-@Service("rjgcExportPaperService")
-public class RjgcExportPaperService extends ExportPaperAbstractService {
-
-    @Override
-    public void downloadPaper(Long rootOrgId, String paperId, String zipFileName, String examType) throws Exception {
-        PaperExp paperExp = initPaperExp(paperId);
-        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 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 = initPaperExp(paperId);
-        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 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 {
-        PaperExp paperExp = initPaperExp(paperId);
-        if (paperExp != null) {
-            String currNum = CommonUtils.getCurNum();
-            // 删除原有试卷文件
-            /*
-             * ExamFile examFile = new ExamFile();
-             * examFile.setExamId(extractConfig.getExamId()+"");
-             * examFile.setCourseId(extractConfig.getCourseCode());
-             * examFile.setOrgId(extractConfig.getOrgId());
-             * examFileService.deleteExamFile(examFile);
-             */
-            // 没有试卷结构导出设置
-            if (exportStructure == null) {
-                // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, 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,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, 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) {
-                // 上传机考JSON文件
-                uploadComputerTestFile(extractConfig, accessUser, examPaper);
-            }
-        }
-    }
-
-}

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

@@ -1,90 +0,0 @@
-package cn.com.qmth.examcloud.core.questions.service.export;
-
-import java.io.File;
-import java.util.List;
-
-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.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.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
- * @date 2017年7月7日 上午11:29:49
- * @company QMTH
- * @description 山东大学导出、上传文件service
- */
-@Service("sddxExportPaperService")
-public class SddxExportPaperService extends ExportPaperAbstractService {
-
-    @Override
-    public void downloadPaper(Long rootOrgId, String paperId, String zipFileName, String examType) throws Exception {
-        PaperExp paperExp = initPaperExp(paperId);
-        if (paperExp != null) {
-            String paperfileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
-                    + ExamFileType.PAPER.getName() + DOCX_SUFFIX;
-            File firectory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
-            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 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 = initPaperExp(paperId);
-        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 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 {
-        PaperExp paperExp = initPaperExp(paperId);
-        if (paperExp != null) {
-            String currNum = CommonUtils.getCurNum();
-            // 没有试卷结构导出设置
-            if (exportStructure == null) {
-                // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, 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,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, 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) {
-                // 上传机考JSON文件
-                uploadComputerTestFile(extractConfig, accessUser, examPaper);
-            }
-        }
-    }
-
-}

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

@@ -1,120 +0,0 @@
-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.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.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.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
- * @date 2017年7月7日 上午11:29:49
- * @company QMTH
- * @description 陕西师范大学导出、上传文件service
- */
-@Service("sxsfExportPaperService")
-public class SxsfExportPaperService extends ExportPaperAbstractService {
-
-    @Override
-    public void downloadPaper(Long rootOrgId, String paperId, String zipFileName, String examType) throws Exception {
-        PaperExp paperExp = super.initPaperExp(paperId);
-        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);
-            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,
-//                        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, ExportTemplateUtil.getTemplate(rootOrgId, ExportTemplateType.PAPER_EXPORT));
-                ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,paperfileName, ExportTemplateType.PAPER_EXPORT);
-            }
-
-//            DocxProcessUtil.processImage(zipFileName + File.separator + paperfileName, wordPackages);
-            // 下载音频
-            super.downloadAudio(paperExp, zipFileName);
-        }
-    }
-
-    @Override
-    public void downloadPaperAnswer(Long rootOrgId, String paperId, String zipFileName) throws Exception {
-        PaperExp paperExp = initPaperExp(paperId);
-        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 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 {
-        PaperExp paperExp = initPaperExp(paperId);
-        if (paperExp != null) {
-            String currNum = CommonUtils.getCurNum();
-            // 删除原有试卷文件
-            /*
-             * ExamFile examFile = new ExamFile();
-             * examFile.setExamId(extractConfig.getExamId()+"");
-             * examFile.setCourseId(extractConfig.getCourseCode());
-             * examFile.setOrgId(extractConfig.getOrgId());
-             * examFileService.deleteExamFile(examFile);
-             */
-            // 没有试卷结构导出设置
-            if (exportStructure == null) {
-                // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,
-                        ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, 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,
-                        ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, 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) {
-                // 上传机考JSON文件
-                uploadComputerTestFile(extractConfig, accessUser, examPaper);
-            }
-        }
-    }
-
-}

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

@@ -5,32 +5,24 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
-import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 
-import cn.com.qmth.examcloud.api.commons.security.bean.User;
 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.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.exception.PaperException;
-import cn.com.qmth.examcloud.core.questions.base.question.enums.QuesStructType;
-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.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.QuestionTypeNum;
+import cn.com.qmth.examcloud.core.questions.service.bean.dto.DownloadPaperDto;
 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;
+import cn.com.qmth.examcloud.core.questions.service.util.PaperUtil;
 
 
 /**
@@ -42,67 +34,30 @@ import cn.com.qmth.examcloud.core.questions.service.util.ExportPaperUtil;
 @Service("sydxExportPaperService")
 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);
+    public void downloadPaper(DownloadPaperDto dto) throws Exception {
+        PaperExp paperExp = initExportSydxPaper(dto);
         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 directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
-            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,paperfileName, ExportTemplateType.PAPER_EXPORT);
+        	setExportQuestionTitle(paperExp.getPaperDetails(), true);
+            String paperfileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
+                    + ExamFileType.PAPER.getName() + DOCX_SUFFIX;
+            File directory = new File(TEMP_FILE_EXP + File.separator + dto.getZipFileName());
+            ExportPaperUtil.createPaperDocFile(dto.getRootOrgId(),paperExp, directory,paperfileName, ExportTemplateType.PAPER_EXPORT);
         }
-
     }
 
     @Override
-    public void downloadPaperAnswer(Long rootOrgId, String paperId, String zipFileName) throws Exception {
-        PaperExp paperExp = initPaperExp(paperId);
+    public void downloadPaperAnswer(DownloadPaperDto dto) throws Exception {
+        PaperExp paperExp = initExportSydxPaper(dto);
         if (paperExp != null) {
             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);
+            File directory = new File(TEMP_FILE_EXP + File.separator + dto.getZipFileName());
+            ExportPaperUtil.createPaperDocFile(dto.getRootOrgId(),paperExp, directory,answerFileName, ExportTemplateType.ANWSER_EXPORT);
         }
 
     }
 
-    @Override
-    public void uploadFile(ExtractConfig extractConfig, String paperId, ExportStructure exportStructure,
-            User accessUser, ExamPaper examPaper) throws Exception {
-        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,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, 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,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, examPaper);
-                // 上传答案
-                uploadPaperOrAnswerFile(exportPaperExp, extractConfig, accessUser, currNum,ExportTemplateType.ANWSER_EXPORT, ExamFileType.ANSWER, examPaper);
-                // 上传试卷结构 不能在上传试卷和答案之前
-                uploadPaperStructure(exportPaperStructureExp, extractConfig, accessUser, currNum, questionTypeNums,
-                        examPaper);
-            } else if (exportStructure != null && exportStructure.getExportType() == ExportType.ONLINE) {
-                // 上传机考JSON文件
-                uploadComputerTestFile(extractConfig, accessUser, examPaper);
-            }
-        }
-    }
 
     /**
      * 初始化导出石油大学试卷DTO
@@ -110,16 +65,16 @@ public class SydxExportPaperService extends ExportPaperAbstractService {
      * @param id
      * @return
      */
-    private PaperExp initExportSydxPaper(String id) throws Exception {
+    private PaperExp initExportSydxPaper(DownloadPaperDto dto) throws Exception {
         // 获取paper
-        Paper paper = Model.of(paperRepo.findById(id));
+        Paper paper = Model.of(paperRepo.findById(dto.getPaperId()));
         paperService.formatPaper(paper, null);
         if (paper == null) {
             throw new PaperException("该试卷不存在");
         }
         // 创建paperDto
         PaperExp paperExp = BeanCopierUtil.copyProperties(paper, PaperExp.class);
-
+        
         paperExp.setTitle(CommonUtils.PAPER_TITLE);
         paperExp.setSubTitle(CommonUtils.PAPER_SUB_TITLE);
         // 获取大题
@@ -137,7 +92,6 @@ public class SydxExportPaperService extends ExportPaperAbstractService {
             paperDetailExp.setTitle(getDetailTitle(paperDetailExp));
             List<PaperDetailUnit> paperDetailUnits = paperDetailUnitRepo
                     .findByPaperDetailOrderByNumber(paperDetails.get(i));
-            setAnswerWord(paperDetailUnits);
             List<PaperDetailUnitExp> paperDetailUnitExps = new ArrayList<PaperDetailUnitExp>();
             for (PaperDetailUnit paperDetailUnit : paperDetailUnits) {
                 PaperDetailUnitExp paperDetailUnitExp = new PaperDetailUnitExp();
@@ -150,139 +104,13 @@ public class SydxExportPaperService extends ExportPaperAbstractService {
         }
         // 初始化试卷序号
         initPaperNum(paperExp);
+        
+        PaperUtil.setQuestionSeq(paperDetailExps, dto.getSeqMode());
         return paperExp;
     }
 
-    /**
-     * 设置客观题答案
-     *
-     * @param answer
-     * @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();
-//    }
 
-    /**
-     * 设置主观题答案
-     *
-     * @param answerWordMl
-     * @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 void setAnswerWord(List<PaperDetailUnit> paperDetailUnits) throws Exception {
-        for (PaperDetailUnit paperDetailUnit : paperDetailUnits) {
-            if (paperDetailUnit == null || paperDetailUnit.getQuestion() == null) {
-                break;
-            }
-            String optionOrder = paperDetailUnit.getOptionOrder();
-            Question question = paperDetailUnit.getQuestion();
-            if (question.getQuestionType() == QuesStructType.SINGLE_ANSWER_QUESTION
-                    || question.getQuestionType() == QuesStructType.MULTIPLE_ANSWER_QUESTION) {
-                setAnswerWordUnit(question, optionOrder);
-            } else if (question.getQuestionType() == QuesStructType.NESTED_ANSWER_QUESTION) {
-                List<Question> subQuestions = question.getSubQuestions();
-                int index = 0;
-                for (int k = 0; k < subQuestions.size(); k++) {
-                    Question subQuestion = subQuestions.get(k);
-                    if (subQuestion.getQuestionType() == QuesStructType.SINGLE_ANSWER_QUESTION
-                            || subQuestion.getQuestionType() == QuesStructType.MULTIPLE_ANSWER_QUESTION) {
-                        if (StringUtils.isNotEmpty(optionOrder) && optionOrder.contains(";")) {
-                            setAnswerWordUnit(subQuestion, optionOrder.split(";")[index]);
-                        } else {
-                            setAnswerWordUnit(subQuestion, "");
-                        }
-                        index++;
-                    }
-                }
-            } else {
-//                question.setQuesAnswerWord(getSubjectAnswer(question.getQuesAnswerWord()));
-            }
-        }
-    }
 
-    private void setAnswerWordUnit(Question question, String optionOrder) throws Exception {
-        List<QuesOption> quesOptions = question.getQuesOptions();
-        if (quesOptions == null || quesOptions.size() == 0) {
-            return;
-        }
-        if (StringUtils.isEmpty(optionOrder)) {
-//            int j = 0;
-//            String answer = "";
-            for (QuesOption quesOption : quesOptions) {
-                if (quesOption.getIsCorrect() == 1) {
-//                    answer += CommonUtils.getOptionNum(j);
-                }
-//                j++;
-            }
-//            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)));
-                    }
-                }
-            }
-        }
-    }
 
     public String getDetailTitle(PaperDetailExp paperDetailExp) {
         int totalScore = paperDetailExp.getScore().intValue();
@@ -300,7 +128,6 @@ public class SydxExportPaperService extends ExportPaperAbstractService {
             return;
         }
         int mainNum = 0;
-//        int subNum = 0;
         Collections.sort(paperExp.getPaperDetails());
         for (PaperDetailExp paperDetail : paperExp.getPaperDetails()) {
             // 大题序号
@@ -309,46 +136,6 @@ public class SydxExportPaperService extends ExportPaperAbstractService {
             if (paperDetail.getPaperDetailUnits() == null || paperDetail.getPaperDetailUnits().size() == 0) {
                 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();
-                // 套题序号
-//                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));
-//                }
-//            }
         }
     }
 

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

@@ -1,110 +0,0 @@
-package cn.com.qmth.examcloud.core.questions.service.export;
-
-import java.io.File;
-import java.util.List;
-
-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.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.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
- * @date 2017年7月7日 上午11:29:49
- * @company QMTH
- * @description 天津大学导出、上传文件service
- */
-@Service("tjdxExportPaperService")
-public class TjdxExportPaperService extends ExportPaperAbstractService {
-
-    @Override
-    public void downloadPaper(Long rootOrgId, String paperId, String zipFileName, String examType) throws Exception {
-        PaperExp paperExp = initPaperExp(paperId);
-        if (paperExp != null) {
-            String paperfileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
-                    + ExamFileType.PAPER.getName() + DOCX_SUFFIX;
-            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);
-//                }
-                ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,paperfileName, ExportTemplateType.OUTLINE_PAPER_EXPORT);
-            } else {
-//                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);
-            // 下载音频
-            super.downloadAudio(paperExp, zipFileName);
-        }
-    }
-
-    @Override
-    public void downloadPaperAnswer(Long rootOrgId, String paperId, String zipFileName) throws Exception {
-        PaperExp paperExp = initPaperExp(paperId);
-        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 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 {
-        PaperExp paperExp = initPaperExp(paperId);
-        if (paperExp != null) {
-            String currNum = CommonUtils.getCurNum();
-            // 没有试卷结构导出设置
-            if (exportStructure == null) {
-                // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, 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,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, 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) {
-                // 上传机考JSON文件
-                uploadComputerTestFile(extractConfig, accessUser, examPaper);
-            }
-        }
-    }
-
-}

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

@@ -1,129 +0,0 @@
-/*
- * ************************************************* Copyright (c) 2019 QMTH.
- * All Rights Reserved. Created by Deason on 2019-07-31 13:58:57.
- * *************************************************
- */
-
-package cn.com.qmth.examcloud.core.questions.service.export;
-
-import java.io.File;
-import java.util.List;
-
-import org.springframework.stereotype.Service;
-
-import cn.com.qmth.examcloud.api.commons.security.bean.User;
-import cn.com.qmth.examcloud.commons.logging.ExamCloudLog;
-import cn.com.qmth.examcloud.commons.logging.ExamCloudLogFactory;
-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.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 QMTH
- * @date 2019-07-31
- */
-@Service("wheqxExportPaperService")
-public class WheqxExportPaperService extends ExportPaperAbstractService {
-
-    protected ExamCloudLog log = ExamCloudLogFactory.getLog(this.getClass());
-
-    @Override
-    public void downloadPaper(Long rootOrgId, String paperId, String zipFileName, String examType) throws Exception {
-        log.debug("题库开始下载试卷...");
-        long startTime = System.currentTimeMillis();
-        PaperExp paperExp = super.initPaperExp(paperId);
-        long paperExpTime = System.currentTimeMillis();
-        log.debug("拼装导出对象耗时:" + (paperExpTime - startTime) + "ms");
-        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));
-
-            long docxImgTime = System.currentTimeMillis();
-//            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");
-            // 下载音频
-            super.downloadAudio(paperExp, zipFileName);
-            long aduioTime = System.currentTimeMillis();
-            log.debug("处理音频耗时:" + (aduioTime - docxImgEndTime) + "ms");
-        }
-    }
-
-    @Override
-    public void downloadPaperAnswer(Long rootOrgId, String paperId, String zipFileName) throws Exception {
-        log.debug("题库开始下载答案...");
-        long startTime = System.currentTimeMillis();
-        PaperExp paperExp = initPaperExp(paperId);
-        long paperExpTime = System.currentTimeMillis();
-        log.debug("拼装导出对象耗时:" + (paperExpTime - startTime) + "ms");
-        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);
-            long docxTime = System.currentTimeMillis();
-//            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");
-        }
-    }
-
-    @Override
-    public void uploadFile(ExtractConfig extractConfig, String paperId, ExportStructure exportStructure,
-            User accessUser, ExamPaper examPaper) throws Exception {
-        PaperExp paperExp = initPaperExp(paperId);
-        if (paperExp != null) {
-            String currNum = CommonUtils.getCurNum();
-            // 删除原有试卷文件
-            /*
-             * ExamFile examFile = new ExamFile();
-             * examFile.setExamId(extractConfig.getExamId()+"");
-             * examFile.setCourseId(extractConfig.getCourseCode());
-             * examFile.setOrgId(extractConfig.getOrgId());
-             * examFileService.deleteExamFile(examFile);
-             */
-            // 没有试卷结构导出设置
-            if (exportStructure == null) {
-                // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, 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,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, 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) {
-                // 上传机考JSON文件
-                uploadComputerTestFile(extractConfig, accessUser, examPaper);
-            }
-        }
-    }
-
-}

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

@@ -1,115 +0,0 @@
-package cn.com.qmth.examcloud.core.questions.service.export;
-
-import java.io.File;
-import java.util.List;
-
-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.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.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
- * @date 2018年11月6日 上午11:29:49
- * @company QMTH
- * @description 西南交通大学大学导出、上传文件service
- */
-@Service("xnjdExportPaperService")
-public class XnjdExportPaperService extends ExportPaperAbstractService {
-
-    @Override
-    public void downloadPaper(Long rootOrgId, String paperId, String zipFileName, String examType) throws Exception {
-        PaperExp paperExp = super.initPaperExp(paperId);
-        if (paperExp != null) {
-            String paperfileName = paperExp.getName() + "_" + paperExp.getCourseNo() + "_"
-                    + ExamFileType.PAPER.getName() + DOCX_SUFFIX;
-            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);
-//                }
-                ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,paperfileName, ExportTemplateType.OUTLINE_PAPER_EXPORT);
-            } else {
-//                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);
-            // 下载音频
-            super.downloadAudio(paperExp, zipFileName);
-        }
-    }
-
-    @Override
-    public void downloadPaperAnswer(Long rootOrgId, String paperId, String zipFileName) throws Exception {
-        PaperExp paperExp = initPaperExp(paperId);
-        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 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 {
-        PaperExp paperExp = initPaperExp(paperId);
-        if (paperExp != null) {
-            String currNum = CommonUtils.getCurNum();
-            // 删除原有试卷文件
-            /*
-             * ExamFile examFile = new ExamFile();
-             * examFile.setExamId(extractConfig.getExamId()+"");
-             * examFile.setCourseId(extractConfig.getCourseCode());
-             * examFile.setOrgId(extractConfig.getOrgId());
-             * examFileService.deleteExamFile(examFile);
-             */
-            // 没有试卷结构导出设置
-            if (exportStructure == null) {
-                // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, 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,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, 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) {
-                // 上传机考JSON文件
-                uploadComputerTestFile(extractConfig, accessUser, examPaper);
-            }
-        }
-    }
-
-}

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

@@ -1,89 +0,0 @@
-package cn.com.qmth.examcloud.core.questions.service.export;
-
-import java.io.File;
-import java.util.List;
-
-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.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.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 {
-
-    @Override
-    public void downloadPaper(Long rootOrgId, String paperId, String zipFileName, String examType) throws Exception {
-        PaperExp paperExp = super.initPaperExp(paperId);
-        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 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 = initPaperExp(paperId);
-        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 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 {
-        PaperExp paperExp = initPaperExp(paperId);
-        if (paperExp != null) {
-            String currNum = CommonUtils.getCurNum();
-            // 删除原有试卷文件
-            /*
-             * ExamFile examFile = new ExamFile();
-             * examFile.setExamId(extractConfig.getExamId()+"");
-             * examFile.setCourseId(extractConfig.getCourseCode());
-             * examFile.setOrgId(extractConfig.getOrgId());
-             * examFileService.deleteExamFile(examFile);
-             */
-            // 没有试卷结构导出设置
-            if (exportStructure == null) {
-                // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, 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,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, 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) {
-                // 上传机考JSON文件
-                uploadComputerTestFile(extractConfig, accessUser, examPaper);
-            }
-        }
-    }
-
-}

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

@@ -1,102 +0,0 @@
-package cn.com.qmth.examcloud.core.questions.service.export;
-
-import java.io.File;
-import java.util.List;
-
-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.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.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
- * @date 2018年7月25日 上午11:29:49
- * @company QMTH
- * @description 中国地质(北京)大学导出、上传文件service
- */
-@Service("zgddbExportPaperService")
-public class ZgddbExportPaperService extends ExportPaperAbstractService {
-
-    @Override
-    public void downloadPaper(Long rootOrgId, String paperId, String zipFileName, String examType) throws Exception {
-        PaperExp paperExp = super.initPaperExp(paperId);
-        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 directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
-            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,paperfileName, ExportTemplateType.PAPER_EXPORT);
-            // 下载音频
-            super.downloadAudio(paperExp, zipFileName);
-        }
-    }
-
-    @Override
-    public void downloadPaperAnswer(Long rootOrgId, String paperId, String zipFileName) throws Exception {
-        PaperExp paperExp = initPaperExp(paperId);
-        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 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 {
-        PaperExp paperExp = initPaperExp(paperId);
-        if (paperExp != null) {
-            String currNum = CommonUtils.getCurNum();
-            // 删除原有试卷文件
-            /*
-             * ExamFile examFile = new ExamFile();
-             * examFile.setExamId(extractConfig.getExamId()+"");
-             * examFile.setCourseId(extractConfig.getCourseCode());
-             * examFile.setOrgId(extractConfig.getOrgId());
-             * examFileService.deleteExamFile(examFile);
-             */
-            // 没有试卷结构导出设置
-            if (exportStructure == null) {
-                // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, 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,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, 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) {
-                // 上传机考JSON文件
-                uploadComputerTestFile(extractConfig, accessUser, examPaper);
-            }
-        }
-    }
-
-}

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

@@ -1,103 +0,0 @@
-package cn.com.qmth.examcloud.core.questions.service.export;
-
-import java.io.File;
-import java.util.List;
-
-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.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.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
- * @date 2018年7月25日 上午11:29:49
- * @company QMTH
- * @description 中国地质(武汉)大学导出、上传文件service
- *              getTemplate(rootOrgId,ExportTemplateType.PAPER_EXPORT),getTemplate(rootOrgId,ExportTemplateType.ANWSER_EXPORT)
- */
-@Service("zgddwExportPaperService")
-public class ZgddwExportPaperService extends ExportPaperAbstractService {
-
-    @Override
-    public void downloadPaper(Long rootOrgId, String paperId, String zipFileName, String examType) throws Exception {
-        PaperExp paperExp = super.initPaperExp(paperId);
-        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 directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
-            ExportPaperUtil.createPaperDocFile(rootOrgId,paperExp, directory,paperfileName, ExportTemplateType.PAPER_EXPORT);
-            // 下载音频
-            super.downloadAudio(paperExp, zipFileName);
-        }
-    }
-
-    @Override
-    public void downloadPaperAnswer(Long rootOrgId, String paperId, String zipFileName) throws Exception {
-        PaperExp paperExp = initPaperExp(paperId);
-        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 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 {
-        PaperExp paperExp = initPaperExp(paperId);
-        if (paperExp != null) {
-            String currNum = CommonUtils.getCurNum();
-            // 删除原有试卷文件
-            /*
-             * ExamFile examFile = new ExamFile();
-             * examFile.setExamId(extractConfig.getExamId()+"");
-             * examFile.setCourseId(extractConfig.getCourseCode());
-             * examFile.setOrgId(extractConfig.getOrgId());
-             * examFileService.deleteExamFile(examFile);
-             */
-            // 没有试卷结构导出设置
-            if (exportStructure == null) {
-                // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, 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, ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, 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) {
-                // 上传机考JSON文件
-                uploadComputerTestFile(extractConfig, accessUser, examPaper);
-            }
-        }
-    }
-
-}

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

@@ -1,86 +0,0 @@
-package cn.com.qmth.examcloud.core.questions.service.export;
-
-import java.io.File;
-import java.util.List;
-
-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.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.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
- * @date 2017.10.23
- * @company QMTH
- * @description 西安交大导出、上传文件service
- */
-@Service("xajdExportPaperService")
-public class xajdExportPaperService extends ExportPaperAbstractService {
-
-    @Override
-    public void downloadPaper(Long rootOrgId, String paperId, String zipFileName, String examType) throws Exception {
-        PaperExp paperExp = initPaperExp(paperId);
-        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 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 = initPaperExp(paperId);
-        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 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 {
-        PaperExp paperExp = initPaperExp(paperId);
-        if (paperExp != null) {
-            String currNum = CommonUtils.getCurNum();
-            // 没有试卷结构导出设置
-            if (exportStructure == null) {
-                // 上传试卷
-                uploadPaperOrAnswerFile(paperExp, extractConfig, accessUser, currNum,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, 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,ExportTemplateType.PAPER_EXPORT, ExamFileType.PAPER, 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) {
-                // 上传机考JSON文件
-                uploadComputerTestFile(extractConfig, accessUser, examPaper);
-            }
-        }
-    }
-
-}

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

@@ -34,6 +34,7 @@ import org.springframework.stereotype.Service;
 import com.google.common.collect.Lists;
 import com.google.gson.Gson;
 
+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;
@@ -41,9 +42,9 @@ 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.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.converter.utils.FileUtil;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExamFileType;
+import cn.com.qmth.examcloud.core.questions.base.enums.PaperSeqMode;
 import cn.com.qmth.examcloud.core.questions.base.question.enums.QuesStructType;
 import cn.com.qmth.examcloud.core.questions.dao.CoursePropertyRepo;
 import cn.com.qmth.examcloud.core.questions.dao.PaperDetailUnitRepo;
@@ -71,12 +72,16 @@ import cn.com.qmth.examcloud.core.questions.service.ExportThemisPaperService;
 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.DownloadPaperDto;
 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.converter.PrintExamPaperService;
 import cn.com.qmth.examcloud.core.questions.service.export.ExportPaperAbstractService;
 import cn.com.qmth.examcloud.core.questions.service.themispaper.ThemisPaperAndAnswer;
 import cn.com.qmth.examcloud.core.questions.service.util.ExportPaperUtil;
+import cn.com.qmth.examcloud.core.questions.service.util.PaperUtil;
+import cn.com.qmth.examcloud.reports.commons.bean.AdminOperateReport;
+import cn.com.qmth.examcloud.reports.commons.util.ReportsUtil;
 import cn.com.qmth.examcloud.support.filestorage.FileStorageUtil;
 
 @Service("exportPaperService")
@@ -128,10 +133,9 @@ 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) {
-        ExportPaperAbstractService exportPaperAbstractService = (ExportPaperAbstractService) SpringContextUtils
-                .getBeanById(serviceName);
+    public void exportPaperFile(String paperId, String exportContentList,
+            HttpServletResponse response, PaperSeqMode seqMode, String examType, String psw, User user) {
+        ExportPaperAbstractService exportPaperAbstractService = PaperUtil.getByRootOrgId(user.getRootOrgId().toString());
         // 根据试卷id查询试卷
         Paper paper = Model.of(paperRepo.findById(paperId));
 
@@ -154,14 +158,16 @@ public class ExportPaperServiceImpl implements ExportPaperService {
                 downThemisPackage(papers, zipFileName);
             }
             try {
+            	DownloadPaperDto dto=new DownloadPaperDto(user.getRootOrgId(), paperId, zipFileName, examType,seqMode);
                 if (exportContentList.indexOf(ExamFileType.PAPER.name()) > -1) {
-                    exportPaperAbstractService.downloadPaper(rootOrgId, paperId, zipFileName, examType);
+                    exportPaperAbstractService.downloadPaper(dto);
                 }
 
                 if (exportContentList.indexOf(ExamFileType.ANSWER.name()) > -1) {
-                    exportPaperAbstractService.downloadPaperAnswer(rootOrgId, paperId, zipFileName);
+                    exportPaperAbstractService.downloadPaperAnswer(dto);
                 }
             } catch (Exception e) {
+                log.error(e.getMessage(), e);
                 throw new StatusException("100001", e.getMessage());
             }
             // 下载考试说明 2018-2-27 weiwehai
@@ -185,8 +191,23 @@ public class ExportPaperServiceImpl implements ExportPaperService {
             long deleteTime = System.currentTimeMillis();
             log.debug("删除文件耗时:" + (deleteTime - endTime) + "ms");
         }
+        StringBuilder paperInfo=new StringBuilder();
+		paperInfo.append("课程:"+paper.getCourse().getName()+"("+paper.getCourse().getCode()+")");
+		paperInfo.append(" 试卷名称:"+paper.getName());
+		paperInfo.append(getContentName(exportContentList));
+		
+		ReportsUtil.report(new AdminOperateReport(user.getRootOrgId(), user.getUserId(), "考试试卷管理-下载",paperInfo.toString()));
     }
 
+    private String getContentName(String exportContentList) {
+    	StringBuilder sb=new StringBuilder();
+    	sb.append(" 下载内容:");
+    	for(String content:exportContentList.split(",")) {
+    		sb.append(ExamFileType.valueOf(content).getName()+",");
+    	}
+    	sb.deleteCharAt(sb.length()-1);
+    	return sb.toString();
+    }
     /**
      * 下载考试说明
      *
@@ -566,10 +587,9 @@ public class ExportPaperServiceImpl implements ExportPaperService {
 
     @SuppressWarnings("unused")
     @Override
-    public void exportPaperFiles(List<String> paperIds, String serviceName, String exportContentList,
-            HttpServletResponse response, String loginName, String examType, Long rootOrgId) throws Exception {
-        ExportPaperAbstractService exportPaperAbstractService = (ExportPaperAbstractService) SpringContextUtils
-                .getBeanById(serviceName);
+    public void exportPaperFiles(List<String> paperIds, String exportContentList,
+            HttpServletResponse response, PaperSeqMode seqMode, String examType, User user) throws Exception {
+        ExportPaperAbstractService exportPaperAbstractService = PaperUtil.getByRootOrgId(user.getRootOrgId().toString());
         // 根据试卷id查询所有试卷
         List<Paper> papers = CommonUtils.toList(paperRepo.findByIdIn(paperIds));
         String zipFileName = IdUtils.uuid();
@@ -580,13 +600,15 @@ public class ExportPaperServiceImpl implements ExportPaperService {
 			// 下载试卷
 			if (exportContentList.indexOf(ExamFileType.PAPER.name()) > -1) {
 				for (Paper paper : papers) {
-					exportPaperAbstractService.downloadPaper(rootOrgId, paper.getId(), zipFileName, examType);
+					DownloadPaperDto dto=new DownloadPaperDto(user.getRootOrgId(), paper.getId(), zipFileName, examType,seqMode);
+					exportPaperAbstractService.downloadPaper(dto);
 				}
 			}
 			// 下载答案
 			if (exportContentList.indexOf(ExamFileType.ANSWER.name()) > -1) {
 				for (Paper paper : papers) {
-					exportPaperAbstractService.downloadPaperAnswer(rootOrgId, paper.getId(), zipFileName);
+					DownloadPaperDto dto=new DownloadPaperDto(user.getRootOrgId(), paper.getId(), zipFileName, examType,seqMode);
+					exportPaperAbstractService.downloadPaperAnswer(dto);
 				}
 			}
 			// 下载机考数据包
@@ -606,6 +628,12 @@ public class ExportPaperServiceImpl implements ExportPaperService {
 			FileUtil.deleteFolder(TEMP_FILE_EXP+ File.separator + zipFileName);
 			FileUtil.deleteFolder(TEMP_FILE_EXP+ File.separator + zipFileName+ ".zip");
 		}
+        StringBuilder paperInfo=new StringBuilder();
+		paperInfo.append("下载数量:"+paperIds.size());
+		paperInfo.append(getContentName(exportContentList));
+		
+		ReportsUtil.report(new AdminOperateReport(user.getRootOrgId(), user.getUserId(), "考试试卷管理-批量下载",paperInfo.toString()));
+    
     }
 
     @Override
@@ -1067,7 +1095,7 @@ public class ExportPaperServiceImpl implements ExportPaperService {
     }
 
     @Override
-    public void downOriginalPaperPlus(String paperId, Long rootOrgId, HttpServletResponse response) throws Exception {
+    public void downOriginalPaperPlus(String paperId, Long rootOrgId, HttpServletResponse response) throws IOException{
         String zipFileName = IdUtils.uuid();
         File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
         if (!directory.exists()) {
@@ -1083,6 +1111,8 @@ public class ExportPaperServiceImpl implements ExportPaperService {
 //            FileUtils.copyDirectory(docxDir, docxTargetDir);
             // 生成导出的试卷对象
             PaperExp paperExp = paperService.getDownPaperExp(paperId);
+            
+            PaperUtil.setQuestionSeq(paperExp.getPaperDetails(), PaperSeqMode.MODE4);
 //            // 处理并生成doc源文件
 //            dispose(docxTargetDir, paperExp);
 //            // 压缩docx源文件

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

@@ -92,7 +92,7 @@ public class ExportThemisPaperServiceImpl implements ExportThemisPaperService {
 							if (blocks != null && blocks.size() > 0) {
 								for (ThemisBlock block : blocks) {
 									if (block.getType().equals("audio")) {
-										String id = block.getValue();
+										String id = block.getValue().substring(0, block.getValue().lastIndexOf("."));
 										QuestionAudio questionAudio = Model.of(questionAudioRepo.findById(id));
 										String audioFileName = questionAudio.getId() + "."
 												+ questionAudio.getFileSuffixes();
@@ -120,7 +120,7 @@ public class ExportThemisPaperServiceImpl implements ExportThemisPaperService {
 										if (blocks != null && blocks.size() > 0) {
 											for (ThemisBlock block : blocks) {
 												if (block.getType().equals("audio")) {
-													String id = block.getValue();
+													String id = block.getValue().substring(0, block.getValue().lastIndexOf("."));
 													QuestionAudio questionAudio = Model
 															.of(questionAudioRepo.findById(id));
 													String audioFileName = questionAudio.getId() + "."
@@ -378,7 +378,9 @@ public class ExportThemisPaperServiceImpl implements ExportThemisPaperService {
 			} else if (rowStr.startsWith("a") && rowStr.contains("id") && rowStr.contains("name")) { // 处理音频
 				rowStr = "<" + rowStr + ">";
 				block.setType("audio");
-				block.setValue(CommonUtils.getAttrValue(rowStr, "id"));
+				String id=CommonUtils.getAttrValue(rowStr, "id");
+				QuestionAudio questionAudio = Model.of(questionAudioRepo.findById(id));
+				block.setValue(questionAudio.getId() + "."+ questionAudio.getFileSuffixes());
 				blocks.add(block);
 				hasAudio = true;
 			} else {

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

@@ -25,15 +25,13 @@ 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.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.enums.PaperSeqMode;
 import cn.com.qmth.examcloud.core.questions.base.excel.ExcelWriter;
-import cn.com.qmth.examcloud.core.questions.dao.ExportServiceManageRepo;
 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;
@@ -47,6 +45,7 @@ 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.DownloadPaperDto;
 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;
@@ -58,6 +57,7 @@ import cn.com.qmth.examcloud.core.questions.service.converter.PrintExamPaperServ
 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.core.questions.service.util.PaperUtil;
 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;
@@ -88,9 +88,6 @@ public class ExtractConfigFileServiceImpl implements ExtractConfigFileService {
     @Autowired
     private ExamFileService examFileService;
 
-    @Autowired
-    private ExportServiceManageRepo exportServiceManageRepo;
-
     @Autowired
     private QuestionAudioService questionAudioService;
 
@@ -108,7 +105,7 @@ public class ExtractConfigFileServiceImpl implements ExtractConfigFileService {
     private SysProperty sysProperty;
 
     @Override
-    public void saveExtractConfigAndBuildPaperFile(ExtractConfig extractConfig, Integer isbuildFile, User user) throws Exception {
+    public void saveExtractConfigAndBuildPaperFile(ExtractConfig extractConfig, Integer isbuildFile, User user,PaperSeqMode seqMode) {
         //新增,id为空
         if (StringUtils.isBlank(extractConfig.getId())) {
             //先查询
@@ -134,7 +131,7 @@ public class ExtractConfigFileServiceImpl implements ExtractConfigFileService {
             //上传抽取试卷对象集合
             for (ExamPaper examPaper : examPaperList) {
                 String paperId = examPaper.getPaper().getId();
-                uploadPaperFile(extractConfig, paperId, exportStructure, user, examPaper);
+                uploadPaperFile(extractConfig, paperId, exportStructure, user, examPaper,seqMode);
             }
         }
         /*if (isbuildFile == 1) {
@@ -164,13 +161,9 @@ public class ExtractConfigFileServiceImpl implements ExtractConfigFileService {
      * @param user
      * @throws Exception
      */
-    private void uploadPaperFile(ExtractConfig extractConfig, String paperId, ExportStructure exportStructure, User user, ExamPaper examPaper) throws Exception {
-        ExportServiceManage esm = exportServiceManageRepo.findByOrgId(String.valueOf(user.getRootOrgId()));
-        if (esm == null) {
-            throw new StatusException("500", "尚未配置导出功能!");
-        }
-        ExportPaperAbstractService exportPaperAbstractService = (ExportPaperAbstractService) SpringContextUtils.getBeanById(esm.getExportServiceName());
-        exportPaperAbstractService.uploadFile(extractConfig, paperId, exportStructure, user, examPaper);
+    private void uploadPaperFile(ExtractConfig extractConfig, String paperId, ExportStructure exportStructure, User user, ExamPaper examPaper,PaperSeqMode seqMode) {
+        ExportPaperAbstractService exportPaperAbstractService = PaperUtil.getByRootOrgId(String.valueOf(user.getRootOrgId()));
+        exportPaperAbstractService.uploadFile(extractConfig, paperId, exportStructure, user, examPaper,seqMode);
     }
 
     @Override
@@ -288,13 +281,11 @@ public class ExtractConfigFileServiceImpl implements ExtractConfigFileService {
      * @throws Exception
      */
     private void downloadAudio(String paperId, ExamFile examFile, String downloadDir, String orgId) throws Exception {
-        //Paper paper = paperRepo.findOne(paperId);
-        ExportServiceManage esm = exportServiceManageRepo.findByOrgId(orgId);
-        if (esm == null) {
-            throw new StatusException("500", "尚未配置导出功能!");
-        }
-        ExportPaperAbstractService exportPaperAbstractService = (ExportPaperAbstractService) SpringContextUtils.getBeanById(esm.getExportServiceName());
-        PaperExp paperExp = exportPaperAbstractService.initPaperExp(paperId);
+        ExportPaperAbstractService exportPaperAbstractService = PaperUtil.getByRootOrgId(orgId);
+        DownloadPaperDto dto=new DownloadPaperDto();
+    	dto.setPaperId(paperId);
+    	dto.setSeqMode(PaperSeqMode.MODE3);
+        PaperExp paperExp = exportPaperAbstractService.initPaperExp(dto);
         //下载考试说明
         if (StringUtils.isNotBlank(paperExp.getExamRemark())) {
             downExamRemark(paperExp, downloadDir, examFile);
@@ -504,11 +495,7 @@ public class ExtractConfigFileServiceImpl implements ExtractConfigFileService {
         //主观题集合
         List<SubjectiveQuestionStructure> subjectiveQuestionStructureList = new ArrayList<>();
 
-        ExportServiceManage esm = exportServiceManageRepo.findByOrgId(exportStructure.getOrgId());
-        if (esm == null) {
-            throw new StatusException("500", "尚未配置导出功能!");
-        }
-        ExportPaperAbstractService exportPaperAbstractService = (ExportPaperAbstractService) SpringContextUtils.getBeanById(esm.getExportServiceName());
+        ExportPaperAbstractService exportPaperAbstractService = PaperUtil.getByRootOrgId(exportStructure.getOrgId());
         Set<Entry<String, String>> entrySet = paperIds.entrySet();
         Iterator<Entry<String, String>> iterator = entrySet.iterator();
 
@@ -518,7 +505,11 @@ public class ExtractConfigFileServiceImpl implements ExtractConfigFileService {
             String paperId = entry.getKey();
             String paperType = entry.getValue();
             logger.info(index + " - 处理试卷:" + paperId);
-            PaperExp paperExp = initPaperExpService.initPaperExp(paperId);//for export test
+            
+            DownloadPaperDto dto=new DownloadPaperDto();
+            dto.setPaperId(paperId);
+        	dto.setSeqMode(PaperSeqMode.MODE3);
+            PaperExp paperExp = initPaperExpService.initPaperExp(dto);//for export test
             logger.info("处理客观题...");
             //添加客观题
             List<PaperDetailExp> objectiveDetails = exportPaperAbstractService.getAllObjectiveDetails(paperExp);

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

@@ -38,6 +38,7 @@ 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.em.enums.ExamType;
 import cn.com.qmth.examcloud.core.questions.base.enums.PaperType;
 import cn.com.qmth.examcloud.core.questions.base.question.PaperDetailDto;
 import cn.com.qmth.examcloud.core.questions.base.question.PaperDetailUnitDto;
@@ -179,13 +180,16 @@ public class ExtractConfigServiceImpl implements ExtractConfigService {
     }
 
     @Override
-    public List<ExamPaper> saveExtractConfig(ExtractConfig extractConfig, User user) throws Exception {
+    public List<ExamPaper> saveExtractConfig(ExtractConfig extractConfig, User user) {
         List<ExamPaper> examPapers = extractConfig.getExamPaperList();
         for (int i = 0; i < examPapers.size(); i++) {
             ExamPaper examPaper = examPapers.get(i);
             Paper paper = examPaper.getPaper();
             paper = Model.of(paperRepo.findById(paper.getId()));
             examPaper.setPaper(paper);
+            if(ExamType.OFFLINE.name().equals(extractConfig.getExamType())) {
+            	checkOfflinePaper(paper);
+            }
         }
         Course course = courseService.getCourse(Long.valueOf(extractConfig.getOrgId()), extractConfig.getCourseCode());
         extractConfig.setCourse(course);
@@ -194,6 +198,28 @@ public class ExtractConfigServiceImpl implements ExtractConfigService {
         extractConfigRepo.save(extractConfig);
         return examPapers;
     }
+    
+    private void checkOfflinePaper(Paper paper) {
+    	List<PaperDetailUnit> pdus=paperDetailUnitRepo.findByPaper(paper);
+    	if(pdus==null||pdus.size()==0) {
+    		return;
+    	}
+    	for(PaperDetailUnit pdu:pdus) {
+    		if (pdu.getQuestionType() == QuesStructType.SINGLE_ANSWER_QUESTION
+                    || pdu.getQuestionType() == QuesStructType.MULTIPLE_ANSWER_QUESTION
+                    || pdu.getQuestionType() == QuesStructType.BOOL_ANSWER_QUESTION){
+    			throw new StatusException("500", "试卷包含客观题,无法保存规则");
+    		}else if(pdu.getQuestionType() == QuesStructType.NESTED_ANSWER_QUESTION&&!CollectionUtils.isEmpty(pdu.getQuestion().getSubQuestions())) {
+    			for(Question q:pdu.getQuestion().getSubQuestions()) {
+    				if (q.getQuestionType() == QuesStructType.SINGLE_ANSWER_QUESTION
+    	                    || q.getQuestionType() == QuesStructType.MULTIPLE_ANSWER_QUESTION
+    	                    || q.getQuestionType() == QuesStructType.BOOL_ANSWER_QUESTION){
+    	    			throw new StatusException("500", "试卷包含客观题,无法保存规则");
+    	    		}
+    			}
+    		}
+    	}
+    }
 
 
     @Override
@@ -1179,5 +1205,19 @@ public class ExtractConfigServiceImpl implements ExtractConfigService {
         }
         return courseInfoList;
     }
+    
+    @Override
+    public List<ExtractConfig> findExtractConfig(Long examId) {
+        if (examId == null) {
+            throw new StatusException("1001", "examId is null");
+        }
+        Query query = new Query();
+        query.addCriteria(Criteria.where("examId").is(examId));
+        query.addCriteria(Criteria.where("course.enable").is("true"));
+
+        List<ExtractConfig> extractConfigList = this.mongoTemplate.find(query, ExtractConfig.class);
+
+        return extractConfigList;
+    }
 
 }

+ 178 - 47
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/impl/GenPaperService.java

@@ -1,5 +1,21 @@
 package cn.com.qmth.examcloud.core.questions.service.impl;
 
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+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.logging.ExamCloudLog;
 import cn.com.qmth.examcloud.commons.logging.ExamCloudLogFactory;
@@ -8,12 +24,20 @@ 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.enums.PaperStructType;
 import cn.com.qmth.examcloud.core.questions.base.enums.PaperType;
+import cn.com.qmth.examcloud.core.questions.base.exception.QuesNotEnoughException;
 import cn.com.qmth.examcloud.core.questions.base.question.enums.QuesStructType;
 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.PaperStructRepo;
-import cn.com.qmth.examcloud.core.questions.dao.entity.*;
+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.PaperDetailStruct;
+import cn.com.qmth.examcloud.core.questions.dao.entity.PaperDetailUnit;
+import cn.com.qmth.examcloud.core.questions.dao.entity.PaperStruct;
+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.service.PaperDetailUnitService;
 import cn.com.qmth.examcloud.core.questions.service.PaperService;
 import cn.com.qmth.examcloud.core.questions.service.bean.context.DetailContext;
@@ -21,12 +45,7 @@ import cn.com.qmth.examcloud.core.questions.service.bean.context.PaperContext;
 import cn.com.qmth.examcloud.core.questions.service.bean.context.UnitContext;
 import cn.com.qmth.examcloud.core.questions.service.bean.dto.GenPaperDto;
 import cn.com.qmth.examcloud.core.questions.service.bean.dto.NumberDto;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import java.math.BigDecimal;
-import java.util.*;
+import cn.com.qmth.examcloud.core.questions.service.util.PaperUtil;
 
 @Service
 public class GenPaperService {
@@ -248,7 +267,7 @@ public class GenPaperService {
             //定义随机选中的小题集合
             List<PaperDetailUnit> selectedUnits = new ArrayList<>();
             //将所有小题按questionId去重,并按试卷分类
-            Map<String, List<PaperDetailUnit>> unitMap = sortUnitsByPaper(paperMap);
+            Map<String, List<PaperDetailUnit>> unitMap = sortUnitsByPaper(paperMap,genPaperDto.getFrozenPaperIds());
             //随机抽题
             for (String paperId : paperMap.keySet()) {
                 NumberDto numberDto = paperMap.get(paperId);
@@ -269,7 +288,7 @@ public class GenPaperService {
                 }
                 //将所有试题按照 公开度  和  难度   进行分类
                 Map<String, List<PaperDetailUnit>> paperUnitMap = sortUnitsByProperty(unitList);
-                List<PaperDetailUnit> newDetailUnits = new ArrayList<>();
+//                List<PaperDetailUnit> newDetailUnits = new ArrayList<>();
                 //获取公开简单数量
                 if (numberDto.getPublicSimple() > 0) {
                     Double needUnitScore = numberDto.getPublicSimple();
@@ -280,7 +299,12 @@ public class GenPaperService {
                         paperMsgMap.put("msg", "\"" + paper.getName() + "\"试卷,题源不够");
                         return paperMsgMap;
                     }
-                    newDetailUnits = commonScoreList(needUnitScore, units, newDetailUnits, genPaperDto.getCreator());
+                    try {
+						commonScoreList(needUnitScore, units, selectedUnits, genPaperDto.getCreator());
+					} catch (QuesNotEnoughException e) {
+						paperMsgMap.put("msg", "\"" + paper.getName() + "\"试卷,题源不够");
+                        return paperMsgMap;
+					}
                 }
                 //获取公开中等数量
                 if (numberDto.getPublicMedium() > 0) {
@@ -292,7 +316,12 @@ public class GenPaperService {
                         paperMsgMap.put("msg", "\"" + paper.getName() + "\"试卷,题源不够");
                         return paperMsgMap;
                     }
-                    newDetailUnits = commonScoreList(needUnitScore, units, newDetailUnits, genPaperDto.getCreator());
+                    try {
+						commonScoreList(needUnitScore, units, selectedUnits, genPaperDto.getCreator());
+					} catch (QuesNotEnoughException e) {
+						paperMsgMap.put("msg", "\"" + paper.getName() + "\"试卷,题源不够");
+                        return paperMsgMap;
+					}
                 }
                 //获取公开困难数量
                 if (numberDto.getPublicDifficulty() > 0) {
@@ -304,7 +333,12 @@ public class GenPaperService {
                         paperMsgMap.put("msg", "\"" + paper.getName() + "\"试卷,题源不够");
                         return paperMsgMap;
                     }
-                    newDetailUnits = commonScoreList(needUnitScore, units, newDetailUnits, genPaperDto.getCreator());
+                    try {
+						commonScoreList(needUnitScore, units, selectedUnits, genPaperDto.getCreator());
+					} catch (QuesNotEnoughException e) {
+						paperMsgMap.put("msg", "\"" + paper.getName() + "\"试卷,题源不够");
+                        return paperMsgMap;
+					}
                 }
                 //获取非公开简单
                 if (numberDto.getNoPublicSimple() > 0) {
@@ -316,7 +350,12 @@ public class GenPaperService {
                         paperMsgMap.put("msg", "\"" + paper.getName() + "\"试卷,题源不够");
                         return paperMsgMap;
                     }
-                    newDetailUnits = commonScoreList(needUnitScore, units, newDetailUnits, genPaperDto.getCreator());
+                    try {
+						commonScoreList(needUnitScore, units, selectedUnits, genPaperDto.getCreator());
+					} catch (QuesNotEnoughException e) {
+						paperMsgMap.put("msg", "\"" + paper.getName() + "\"试卷,题源不够");
+                        return paperMsgMap;
+					}
                 }
                 //获取非公开中等
                 if (numberDto.getNoPublicMedium() > 0) {
@@ -328,7 +367,12 @@ public class GenPaperService {
                         paperMsgMap.put("msg", "\"" + paper.getName() + "\"试卷,题源不够");
                         return paperMsgMap;
                     }
-                    newDetailUnits = commonScoreList(needUnitScore, units, newDetailUnits, genPaperDto.getCreator());
+                    try {
+						commonScoreList(needUnitScore, units, selectedUnits, genPaperDto.getCreator());
+					} catch (QuesNotEnoughException e) {
+						paperMsgMap.put("msg", "\"" + paper.getName() + "\"试卷,题源不够");
+                        return paperMsgMap;
+					}
                 }
                 //获取非公开困难
                 if (numberDto.getNoPublicDifficulty() > 0) {
@@ -340,7 +384,12 @@ public class GenPaperService {
                         paperMsgMap.put("msg", "\"" + paper.getName() + "\"试卷,题源不够");
                         return paperMsgMap;
                     }
-                    newDetailUnits = commonScoreList(needUnitScore, units, newDetailUnits, genPaperDto.getCreator());
+                    try {
+						commonScoreList(needUnitScore, units, selectedUnits, genPaperDto.getCreator());
+					} catch (QuesNotEnoughException e) {
+						paperMsgMap.put("msg", "\"" + paper.getName() + "\"试卷,题源不够");
+                        return paperMsgMap;
+					}
                 }
                 //生成随机抽取的题号
     		  /*List<Integer> questionsIndex = new ArrayList<>();
@@ -360,7 +409,7 @@ public class GenPaperService {
 					newUnit.setPaperType(PaperType.GENERATE);
 					newDetailUnits.add(newUnit);
     			}*/
-                selectedUnits.addAll(newDetailUnits);
+//                selectedUnits.addAll(newDetailUnits);
             }
             if (selectedUnits == null || selectedUnits.size() < 1) {
                 paperMsgMap.put("msg", "组卷分数为0,组卷失败");
@@ -400,7 +449,7 @@ public class GenPaperService {
             //定义随机选中的小题集合
             List<PaperDetailUnit> selectedUnits = new ArrayList<>();
             //将所有小题按questionId去重,并按试卷分类
-            Map<String, List<PaperDetailUnit>> unitMap = sortUnitsByPaper(paperMap);
+            Map<String, List<PaperDetailUnit>> unitMap = sortUnitsByPaper(paperMap,genPaperDto.getFrozenPaperIds());
             //随机抽题
             for (String paperId : paperMap.keySet()) {
                 //随机抽题数量
@@ -421,7 +470,7 @@ public class GenPaperService {
                 }
                 //将所有试题按照 公开度  和  难度   进行分类
                 Map<String, List<PaperDetailUnit>> paperUnitMap = sortUnitsByProperty(unitList);
-                List<PaperDetailUnit> newDetailUnits = new ArrayList<>();
+//                List<PaperDetailUnit> newDetailUnits = new ArrayList<>();
                 //获取公开简单数量
                 if (numberDto.getPublicSimple() > 0) {
                     Integer needUnits = Integer.valueOf(numberDto.getPublicSimple().intValue());
@@ -430,7 +479,12 @@ public class GenPaperService {
                         paperMsgMap.put("msg", "\"" + paper.getName() + "\"试卷,题源不够");
                         return paperMsgMap;
                     }
-                    newDetailUnits = commonNumList(needUnits, units, newDetailUnits, genPaperDto.getCreator());
+                    try {
+						commonNumList(needUnits, units, selectedUnits, genPaperDto.getCreator());
+					} catch (QuesNotEnoughException e) {
+						paperMsgMap.put("msg", "\"" + paper.getName() + "\"试卷,题源不够");
+                        return paperMsgMap;
+					}
                 }
                 //获取公开中等数量
                 if (numberDto.getPublicMedium() > 0) {
@@ -440,7 +494,12 @@ public class GenPaperService {
                         paperMsgMap.put("msg", "\"" + paper.getName() + "\"试卷,题源不够");
                         return paperMsgMap;
                     }
-                    newDetailUnits = commonNumList(needUnits, units, newDetailUnits, genPaperDto.getCreator());
+                    try {
+						commonNumList(needUnits, units, selectedUnits, genPaperDto.getCreator());
+					} catch (QuesNotEnoughException e) {
+						paperMsgMap.put("msg", "\"" + paper.getName() + "\"试卷,题源不够");
+                        return paperMsgMap;
+					}
                 }
                 //获取公开困难数量
                 if (numberDto.getPublicDifficulty() > 0) {
@@ -450,7 +509,12 @@ public class GenPaperService {
                         paperMsgMap.put("msg", "\"" + paper.getName() + "\"试卷,题源不够");
                         return paperMsgMap;
                     }
-                    newDetailUnits = commonNumList(needUnits, units, newDetailUnits, genPaperDto.getCreator());
+                    try {
+						commonNumList(needUnits, units, selectedUnits, genPaperDto.getCreator());
+					} catch (QuesNotEnoughException e) {
+						paperMsgMap.put("msg", "\"" + paper.getName() + "\"试卷,题源不够");
+                        return paperMsgMap;
+					}
                 }
                 //获取非公开简单
                 if (numberDto.getNoPublicSimple() > 0) {
@@ -460,7 +524,12 @@ public class GenPaperService {
                         paperMsgMap.put("msg", "\"" + paper.getName() + "\"试卷,题源不够");
                         return paperMsgMap;
                     }
-                    newDetailUnits = commonNumList(needUnits, units, newDetailUnits, genPaperDto.getCreator());
+                    try {
+						commonNumList(needUnits, units, selectedUnits, genPaperDto.getCreator());
+					} catch (QuesNotEnoughException e) {
+						paperMsgMap.put("msg", "\"" + paper.getName() + "\"试卷,题源不够");
+                        return paperMsgMap;
+					}
                 }
                 //获取非公开中等
                 if (numberDto.getNoPublicMedium() > 0) {
@@ -470,7 +539,12 @@ public class GenPaperService {
                         paperMsgMap.put("msg", "\"" + paper.getName() + "\"试卷,题源不够");
                         return paperMsgMap;
                     }
-                    newDetailUnits = commonNumList(needUnits, units, newDetailUnits, genPaperDto.getCreator());
+                    try {
+						commonNumList(needUnits, units, selectedUnits, genPaperDto.getCreator());
+					} catch (QuesNotEnoughException e) {
+						paperMsgMap.put("msg", "\"" + paper.getName() + "\"试卷,题源不够");
+                        return paperMsgMap;
+					}
                 }
                 //获取非公开困难
                 if (numberDto.getNoPublicDifficulty() > 0) {
@@ -480,7 +554,12 @@ public class GenPaperService {
                         paperMsgMap.put("msg", "\"" + paper.getName() + "\"试卷,题源不够");
                         return paperMsgMap;
                     }
-                    newDetailUnits = commonNumList(needUnits, units, newDetailUnits, genPaperDto.getCreator());
+                    try {
+						commonNumList(needUnits, units, selectedUnits, genPaperDto.getCreator());
+					} catch (QuesNotEnoughException e) {
+						paperMsgMap.put("msg", "\"" + paper.getName() + "\"试卷,题源不够");
+                        return paperMsgMap;
+					}
                 }
                 //生成随机抽取的题号
     			/*List<Integer> questionsIndex = new ArrayList<>();
@@ -507,7 +586,7 @@ public class GenPaperService {
 					newUnit.setPaperType(PaperType.GENERATE);
 					newDetailUnits.add(newUnit);
     			}*/
-                selectedUnits.addAll(newDetailUnits);
+//                selectedUnits.addAll(newDetailUnits);
             }
             if (selectedUnits == null || selectedUnits.size() < 1) {
                 paperMsgMap.put("msg", "试题数量为0,组卷失败");
@@ -530,21 +609,24 @@ public class GenPaperService {
      *
      * @param needUnits
      * @param units
-     * @param newDetailUnits
+     * @param selectedUnits
      * @param name
      * @return
+     * @throws QuesNotEnoughException 
      */
-    private List<PaperDetailUnit> commonNumList(Integer needUnits, List<PaperDetailUnit> units, List<PaperDetailUnit> newDetailUnits, String name) {
+    private void commonNumList(Integer needUnits, List<PaperDetailUnit> units, List<PaperDetailUnit> selectedUnits, String name) throws QuesNotEnoughException {
         Collections.shuffle(units);
         int lastNumber = 0;
-        for (int index = 0; index < needUnits; index++) {
+        for (PaperDetailUnit newUnit:units) {
             //如果抽题的数量大于所需的题量,跳出循环
             if (lastNumber >= needUnits) {
                 break;
             }
-            PaperDetailUnit newUnit = units.get(index);
+            if(checkExist(selectedUnits, newUnit)) {
+            	continue;
+            }
             //如果是套题,取子题数量
-            if (units.get(index).getQuestion().getQuestionType() == QuesStructType.NESTED_ANSWER_QUESTION) {
+            if (newUnit.getQuestion().getQuestionType() == QuesStructType.NESTED_ANSWER_QUESTION) {
                 List<Question> subQuestions = newUnit.getQuestion().getSubQuestions();
                 lastNumber += subQuestions.size();
             } else {
@@ -553,9 +635,11 @@ public class GenPaperService {
             newUnit.setId(null);
             newUnit.setCreator(name);
             newUnit.setCreateTime(CommonUtils.getCurDateTime());
-            newDetailUnits.add(newUnit);
+            selectedUnits.add(newUnit);
+        }
+        if(lastNumber<needUnits) {
+        	throw new QuesNotEnoughException(); 
         }
-        return newDetailUnits;
     }
 
     /**
@@ -563,51 +647,95 @@ public class GenPaperService {
      *
      * @param needUnitScore
      * @param units
-     * @param newDetailUnits
+     * @param selectedUnits
      * @param name
      * @return
+     * @throws QuesNotEnoughException 
      */
-    private List<PaperDetailUnit> commonScoreList(Double needUnitScore, List<PaperDetailUnit> units, List<PaperDetailUnit> newDetailUnits, String name) {
+    private void commonScoreList(Double needUnitScore, List<PaperDetailUnit> units, List<PaperDetailUnit> selectedUnits, String name) throws QuesNotEnoughException {
         Collections.shuffle(units);
         double sum = 0.0;
         for (PaperDetailUnit unit : units) {
             if (sum >= needUnitScore) {
                 break;
             }
+            if(checkExist(selectedUnits, unit)) {
+            	continue;
+            }
             PaperDetailUnit newUnit = unit;
             sum += newUnit.getScore();
             newUnit.setId(null);
             newUnit.setCreator(name);
             newUnit.setCreateTime(CommonUtils.getCurDateTime());
-            newDetailUnits.add(newUnit);
+            selectedUnits.add(newUnit);
+        }
+        if(sum<needUnitScore) {
+        	throw new QuesNotEnoughException(); 
         }
-        return newDetailUnits;
+    }
+    
+    private boolean checkExist(List<PaperDetailUnit> selectedUnits,PaperDetailUnit unit) {
+    	for(PaperDetailUnit pu:selectedUnits) {
+    		if(pu.equals(unit)) {
+    			return true;
+    		}
+    	}
+    	return false;
     }
 
-    //将所有小题按questionId去重,并按试卷分类
-    private Map<String, List<PaperDetailUnit>> sortUnitsByPaper(Map<String, NumberDto> paperMap) {
+    //将所有小题并按试卷分类
+    private Map<String, List<PaperDetailUnit>> sortUnitsByPaper(Map<String, NumberDto> paperMap,List<String> frozenPaperIds) {
         if (paperMap == null || paperMap.isEmpty()) {
             return new HashMap<>();
         }
+        
+        //冻结小题id集合
+        Set<String> frozenQuestionIds = new HashSet<>();
 
         //所有小题集合
         List<PaperDetailUnit> oldUnits = new ArrayList<>();
+        
+        //取到所有冻结小题
+        if(CollectionUtils.isNotEmpty(frozenPaperIds)) {
+        	for (String paperId : frozenPaperIds) {
+        		//取到所有小题
+                Paper paper = Model.of(paperRepo.findById(paperId));
+                List<PaperDetailUnit> unitList = unitRepo.findByPaperOrderByNumber(paper);
+                oldUnits.addAll(unitList);
+                //加入到冻结小题集合
+            	List<String> tempIds=unitList.stream().map(dto -> dto.getQuestion().getId()).distinct().collect(Collectors.toList());
+        		frozenQuestionIds.addAll(tempIds);
+        	}
+        }
 
         //取到试卷id
         for (String paperId : paperMap.keySet()) {
-            //取到所有小题
-            Paper paper = Model.of(paperRepo.findById(paperId));
-            List<PaperDetailUnit> unitList = unitRepo.findByPaperOrderByNumber(paper);
-            oldUnits.addAll(unitList);
+        	if(CollectionUtils.isNotEmpty(frozenPaperIds)) {
+            	if(!frozenPaperIds.contains(paperId)) {
+            		//取到所有非冻结小题
+    	            Paper paper = Model.of(paperRepo.findById(paperId));
+    	            List<PaperDetailUnit> unitList = unitRepo.findByPaperOrderByNumber(paper);
+    	            for(PaperDetailUnit pdu:unitList) {
+    	            	if(!frozenQuestionIds.contains(pdu.getQuestion().getId())) {
+    	            		oldUnits.add(pdu);
+    	            	}
+    	            }
+            	}
+        	}else {
+        		//取到所有非冻结小题
+	            Paper paper = Model.of(paperRepo.findById(paperId));
+	            List<PaperDetailUnit> unitList = unitRepo.findByPaperOrderByNumber(paper);
+	            oldUnits.addAll(unitList);
+        	}
         }
 
-        //如果是卷库来源,进行questionId去重
-        Set<PaperDetailUnit> spareUnits = new HashSet<>();
-        spareUnits.addAll(oldUnits);
+//        如果是卷库来源,进行questionId去重(变更,不去重)
+//        Set<PaperDetailUnit> spareUnits = new HashSet<>();
+//        spareUnits.addAll(oldUnits);
         Map<String, List<PaperDetailUnit>> map = new HashMap<>();
 
         List<PaperDetailUnit> units;
-        for (PaperDetailUnit unit : spareUnits) {
+        for (PaperDetailUnit unit : oldUnits) {
             if (map.get(unit.getPaper().getId()) == null) {
                 units = new ArrayList<>();
             } else {
@@ -727,10 +855,14 @@ public class GenPaperService {
             }
             paperDetail.setScore(b1.doubleValue());
             paperDetail.setUnitCount(paperDetailUnits.size());
+            paperDetail.setPaperDetailUnits(map.get(paperDetail.getName()));
             paperDetails.add(paperDetail);
         }
+        PaperUtil.sortDetails(paperDetails);
         return paperDetails;
     }
+    
+    
 
     //把集合里面相同大题的小题分类
     private Map<String, List<PaperDetailUnit>> sortPaperDeatilUnit(List<PaperDetailUnit> selectedUnits) {
@@ -1096,7 +1228,6 @@ public class GenPaperService {
         String msg = "";
         Map<String, Object> paperMsgMap = new HashMap<>();
         //查询试卷结构
-        long start = System.currentTimeMillis();
         PaperStruct paperStruct = Model.of(paperStructRepo.findById(genPaperDto.getPaperStructId()));
         if (paperStruct == null) {
             paperMsgMap.put("msg", "试卷结构不存在");

+ 151 - 6
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/impl/PaperDetailServiceImpl.java

@@ -1,7 +1,22 @@
 package cn.com.qmth.examcloud.core.questions.service.impl;
 
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.bson.types.ObjectId;
+import org.springframework.beans.factory.annotation.Autowired;
+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.data.mongodb.core.query.Update;
+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.Model;
+import cn.com.qmth.examcloud.core.questions.base.enums.PaperType;
 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;
@@ -11,10 +26,8 @@ import cn.com.qmth.examcloud.core.questions.dao.entity.PaperDetailUnit;
 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.QuesTypeNameService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
+import cn.com.qmth.examcloud.reports.commons.bean.AdminOperateReport;
+import cn.com.qmth.examcloud.reports.commons.util.ReportsUtil;
 
 /**
  * @author chenken
@@ -39,6 +52,9 @@ public class PaperDetailServiceImpl implements PaperDetailService {
 
     @Autowired
     PaperDetailUnitRepo paperDetailUnitRepo;
+    
+	@Autowired
+	MongoTemplate mongoTemplate;
 
     /**
      * 根据Id获得对应所有小题
@@ -71,20 +87,45 @@ public class PaperDetailServiceImpl implements PaperDetailService {
         paper.setLastModifyName(user.getDisplayName());
         paper = paperRepo.save(paper);
         pd.setPaper(paper);
+        PaperDetail oldpaperDetail = Model.of(paperDetailRepo.findById(pd.getId()));
         PaperDetail paperDetail = paperDetailRepo.save(pd);
         List<PaperDetailUnit> paperDetailUnits = paperDetailUnitRepo.findByPaperDetailOrderByNumber(paperDetail);
         quesTypeNameService.saveQuesTypeName(paperDetailUnits);
+        
+        if(!oldpaperDetail.getName().equals(paperDetail.getName())) {
+        	StringBuilder paperInfo=new StringBuilder();
+        	paperInfo.append("课程:"+paper.getCourse().getName()+"("+paper.getCourse().getCode()+") 试卷名称:"+paper.getName());
+            paperInfo.append("第"+paperDetail.getNumber()+"大题名称由改 "+oldpaperDetail.getName()+" 为 "+paperDetail.getName());
+        	if(PaperType.IMPORT.equals(paper.getPaperType())) {
+	            ReportsUtil.report(new AdminOperateReport(user.getRootOrgId(), user.getUserId(), "导入试卷管理-修改大题名称",paperInfo.toString()));
+        	}else {
+	            ReportsUtil.report(new AdminOperateReport(user.getRootOrgId(), user.getUserId(), "考试试卷管理-修改大题名称",paperInfo.toString()));
+        
+        	}
+        }
         return paperDetail;
     }
-
+    
     /**
      * 删除大题
      *
      * @param id
      * @return
      */
-    public void deletePaperDetail(String id) {
+    public void deletePaperDetail(String paperId,String id,User user) {
+    	Paper paper = Model.of(paperRepo.findById(paperId));
+    	PaperDetail oldpaperDetail = Model.of(paperDetailRepo.findById(id));
         paperDetailRepo.deleteById(id);
+        StringBuilder paperInfo=new StringBuilder();
+        paperInfo.append("课程:"+paper.getCourse().getName()+"("+paper.getCourse().getCode()+") 试卷名称:"+paper.getName());
+        paperInfo.append("删除第"+oldpaperDetail.getNumber()+"大题");
+        Integer dc=paper.getPaperDetailCount();
+        paperInfo.append(" 试卷大题数量变动("+dc+"变为"+(dc-1)+")");
+    	if(PaperType.IMPORT.equals(paper.getPaperType())) {
+            ReportsUtil.report(new AdminOperateReport(user.getRootOrgId(), user.getUserId(), "导入试卷管理-删除大题",paperInfo.toString()));
+    	}else {
+            ReportsUtil.report(new AdminOperateReport(user.getRootOrgId(), user.getUserId(), "考试试卷管理-删除大题",paperInfo.toString()));
+    	}
     }
 
     /**
@@ -121,4 +162,108 @@ public class PaperDetailServiceImpl implements PaperDetailService {
         }
     }
 
+	@Override
+	public void movePaperDetail(String paperId, String detailId, String vc, User user) {
+		Paper paper = Model.of(paperRepo.findById(paperId));
+		List<PaperDetail> pds=getPaperDetailsByPaper(paper);
+		if(pds==null||pds.size()<=1) {
+			throw new StatusException("500", "大题数量未达到两题,无法移动");
+		}
+		if(detailId.equals(pds.get(0).getId())&&"up".equals(vc)) {
+			throw new StatusException("500", "第一题无法上移");
+		}
+		if(detailId.equals(pds.get(pds.size()-1).getId())&&"down".equals(vc)) {
+			throw new StatusException("500", "最后一题无法下移");
+		}
+		int number=movePaperDetail(pds, detailId, vc);
+		List<PaperDetailUnit> pdus=paperDetailUnitRepo.findByPaperIdOrderByNumber(paperId);
+		if(pdus!=null&&pdus.size()>0) {
+			int subIndex=0;
+			Map<String,List<PaperDetailUnit>> map=getPaperDetailUnitMap(pdus);
+			for(PaperDetail pd:pds) {
+				for(PaperDetailUnit pdu:map.get(pd.getId())) {
+					subIndex++;
+					pdu.setNumber(subIndex);
+				}
+			}
+			savePaperDetailUnitNumber(pds, map);
+		}
+		savePaperDetailNumber(pds);
+		
+		StringBuilder paperInfo=new StringBuilder();
+        paperInfo.append("课程:"+paper.getCourse().getName()+"("+paper.getCourse().getCode()+") 试卷名称:"+paper.getName());
+        if("up".equals(vc)) {
+        	paperInfo.append(" 上移");
+        }else {
+        	paperInfo.append(" 下移");
+        }
+        paperInfo.append("第"+number+"大题");
+        ReportsUtil.report(new AdminOperateReport(user.getRootOrgId(), user.getUserId(), "考试试卷管理-移动大题",paperInfo.toString()));
+	}
+	
+	private void savePaperDetailNumber(List<PaperDetail> pds) {
+		Query query;
+		int index=0;
+		for(PaperDetail pd:pds) {
+			index++;
+			if(pd.getId().length()==24) {
+				query = Query.query(Criteria.where("_id").is(new ObjectId(pd.getId())));
+			}else {
+				query = Query.query(Criteria.where("_id").is(pd.getId()));
+			}
+	        Update update = new Update();
+	        update.set("number", index);
+	        mongoTemplate.updateFirst(query, update, "paperDetail");
+		}
+	}
+	
+	private void savePaperDetailUnitNumber(List<PaperDetail> pds,Map<String,List<PaperDetailUnit>> map) {
+		Query query;
+		for(PaperDetail pd:pds) {
+			for(PaperDetailUnit pdu:map.get(pd.getId())) {
+				if(pdu.getId().length()==24) {
+					query = Query.query(Criteria.where("_id").is(new ObjectId(pdu.getId())));
+				}else {
+					query = Query.query(Criteria.where("_id").is(pdu.getId()));
+				}
+		        Update update = new Update();
+		        update.set("number", pdu.getNumber());
+		        mongoTemplate.updateFirst(query, update, "paperDetailUnit");
+			}
+		}
+	}
+	
+	private int movePaperDetail(List<PaperDetail> pds,String detailId,String vc) {
+		for(int i=0;i<pds.size();i++) {
+			if(pds.get(i).getId().equals(detailId)) {
+				if("up".equals(vc)) {
+					PaperDetail tem=pds.get(i);
+					pds.set(i, pds.get(i-1));
+					pds.set(i-1, tem);
+				}else {
+					PaperDetail tem=pds.get(i);
+					pds.set(i, pds.get(i+1));
+					pds.set(i+1, tem);
+				}
+				return i+1;
+			}
+		}
+		return -1;
+	}
+	
+	private Map<String,List<PaperDetailUnit>> getPaperDetailUnitMap(List<PaperDetailUnit> pdus){
+		Map<String,List<PaperDetailUnit>> map=new HashMap<>();
+		
+		for(PaperDetailUnit pdu:pdus) {
+			List<PaperDetailUnit> pl=map.get(pdu.getPaperDetail().getId());
+			if(pl==null) {
+				pl=new ArrayList<>();
+				map.put(pdu.getPaperDetail().getId(),pl);
+			}
+			pl.add(pdu);
+		}
+		
+		return map;
+	}
+
 }

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

@@ -8,7 +8,6 @@ import org.apache.commons.lang3.StringUtils;
 import org.bson.types.ObjectId;
 import org.jsoup.Jsoup;
 import org.jsoup.nodes.Document;
-import org.jsoup.nodes.Element;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Sort;
 import org.springframework.data.domain.Sort.Direction;
@@ -25,6 +24,7 @@ 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.dao.PaperDetailUnitRepo;
+import cn.com.qmth.examcloud.core.questions.dao.PaperRepo;
 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;
@@ -37,6 +37,9 @@ import cn.com.qmth.examcloud.core.questions.service.cache.BasePaperCache;
 import cn.com.qmth.examcloud.core.questions.service.cache.ExtractConfigPaperCache;
 import cn.com.qmth.examcloud.core.questions.service.cache.QuestionAnswerCache;
 import cn.com.qmth.examcloud.core.questions.service.cache.QuestionCache;
+import cn.com.qmth.examcloud.core.questions.service.util.PaperUtil;
+import cn.com.qmth.examcloud.reports.commons.bean.AdminOperateReport;
+import cn.com.qmth.examcloud.reports.commons.util.ReportsUtil;
 
 /**
  * @author chenken
@@ -45,6 +48,8 @@ import cn.com.qmth.examcloud.core.questions.service.cache.QuestionCache;
  */
 @Service("paperDetailUnitService")
 public class PaperDetailUnitServiceImpl implements PaperDetailUnitService {
+    @Autowired
+    PaperRepo paperRepo;
     @Autowired
     private ExtractConfigPaperCache extractConfigPaperCache;
     @Autowired
@@ -128,12 +133,17 @@ public class PaperDetailUnitServiceImpl implements PaperDetailUnitService {
      * 保存小题
      */
     public PaperDetailUnit savePaperDetailUnit(PaperDetailUnitExp updateUnit, User user) {
+    	StringBuilder sb=new StringBuilder();
         PaperDetailUnit baseUnit = Model.of(paperDetailUnitRepo.findById(updateUnit.getId()));
         Question baseQuestion = baseUnit.getQuestion();
         Question updateQuestion = updateUnit.getQuestion();
         checkFillBlankQuestion(updateQuestion);
         if (baseUnit.getQuestionType() == QuesStructType.NESTED_ANSWER_QUESTION) {
             if (updateQuestion.getId().equals(baseQuestion.getId())) {
+            	
+            	if(!StringUtils.equals(baseQuestion.getQuesBody(), updateQuestion.getQuesBody())) {
+            		sb.append(" 第"+baseUnit.getNumber()+"小题(套题)题干变动");
+            	}
                 // 更新对象为套题本身
                 quesService.saveQues(updateQuestion);
                 baseUnit.setQuestion(updateQuestion);
@@ -151,6 +161,10 @@ public class PaperDetailUnitServiceImpl implements PaperDetailUnitService {
 
                     Question sub = baseQuestion.getSubQuestions().get(index - 1);
                     if (updateQuestion.getId().equals(sub.getId())) {
+                    	String changInfo=getQuestionChangeInfo(sub, updateQuestion);
+                    	if(changInfo!=null) {
+                    		sb.append("第"+baseUnit.getNumber()+"小题第"+index+"子题变动:"+changInfo);
+                    	}
                         // 匹配到子题
                         subScoreList.set(index - 1, updateUnit.getScore());
                         baseQuestion.getSubQuestions().set(index - 1, updateQuestion);
@@ -197,6 +211,10 @@ public class PaperDetailUnitServiceImpl implements PaperDetailUnitService {
                 baseUnit.setSubScoreList(subScoreList);
             }
         } else {
+        	String changInfo=getQuestionChangeInfo(baseQuestion, updateQuestion);
+        	if(changInfo!=null) {
+        		sb.append("第"+baseUnit.getNumber()+"小题变动:"+changInfo);
+        	}
             quesService.saveQues(updateQuestion);
             baseUnit.setQuestion(updateQuestion);
             baseUnit.setScore(updateUnit.getScore());
@@ -206,8 +224,26 @@ public class PaperDetailUnitServiceImpl implements PaperDetailUnitService {
         paperDetailUnitRepo.save(baseUnit);
 
         Paper paper = baseUnit.getPaper();
+        Double total=paper.getTotalScore();
+        Integer dc=paper.getPaperDetailCount();
+        Integer uc=paper.getUnitCount();
         paperService.formatPaper(paper, user);
 
+        String changInfo=PaperUtil.getPaperChangeInfo(total, dc, uc, paper);
+    	if(changInfo!=null) {
+    		sb.append(changInfo);
+    	}
+    	if(sb.length()!=0) {
+    		StringBuilder paperInfo=new StringBuilder();
+    		paperInfo.append(" 课程:"+paper.getCourse().getName()+"("+paper.getCourse().getCode()+")");
+    		paperInfo.append(" 试卷名称:"+paper.getName());
+    		sb.append(paperInfo);
+    		if(PaperType.IMPORT.equals(paper.getPaperType())) {
+    			ReportsUtil.report(new AdminOperateReport(user.getRootOrgId(), user.getUserId(), "导入试卷管理-编辑小题",sb.toString()));
+    		}else {
+    			ReportsUtil.report(new AdminOperateReport(user.getRootOrgId(), user.getUserId(), "考试试卷管理-编辑小题",sb.toString()));
+    		}
+    	}
         if (baseUnit.getQuestion() != null) {
             //清除缓存
             this.clearQuestionCache(baseUnit.getQuestion().getId());
@@ -215,6 +251,42 @@ public class PaperDetailUnitServiceImpl implements PaperDetailUnitService {
 
         return baseUnit;
     }
+    
+    
+    private String getQuestionChangeInfo(Question old,Question now) {
+    	StringBuilder sb=new StringBuilder();
+    	if(old.getScore().doubleValue() !=now.getScore().doubleValue()) {
+    		sb.append(" 分数变动("+old.getScore()+"变为"+now.getScore()+")");
+    	}
+    	if(!StringUtils.equals(old.getQuesBody(), now.getQuesBody())) {
+    		sb.append(" 题干变动");
+    	}
+    	if(optionChange(old, now)) {
+    		sb.append(" 选项变动");
+    	}
+    	if(!StringUtils.equals(old.getQuesAnswer(), now.getQuesAnswer())) {
+    		sb.append(" 答案变动");
+    	}
+    	if(sb.length()==0) {
+    		return null;
+    	}
+    	return sb.toString();
+    }
+    
+    private boolean optionChange(Question old,Question now) {
+    	if(now.getQuesOptions()==null) {
+    		return false;
+    	}
+    	if(old.getQuesOptions().size()!=now.getQuesOptions().size()) {
+    		return true;
+    	}
+    	for(int i=0;i<now.getQuesOptions().size();i++) {
+    		if(!StringUtils.equals(old.getQuesOptions().get(i).getOptionBody(), now.getQuesOptions().get(i).getOptionBody())) {
+    			return true;
+        	}
+    	}
+    	return false;
+    }
     /**
      * 删除小题
      *
@@ -222,6 +294,7 @@ public class PaperDetailUnitServiceImpl implements PaperDetailUnitService {
      * @return
      */
     public void deletePaperDetailUnit(String id, User user) {
+    	String changInfo=null;
         PaperDetailUnit detailUnit = Model.of(paperDetailUnitRepo.findById(id));
         Paper paper = detailUnit.getPaper();
         paperDetailUnitRepo.deleteById(id);
@@ -230,8 +303,19 @@ public class PaperDetailUnitServiceImpl implements PaperDetailUnitService {
             //清除缓存
             this.clearQuestionCache(detailUnit.getQuestion().getId());
         }
-
+        Double total=paper.getTotalScore();
+        Integer dc=paper.getPaperDetailCount();
+        Integer uc=paper.getUnitCount();
         paperService.formatPaper(paper, user);
+        changInfo=PaperUtil.getPaperChangeInfo(total, dc, uc, paper);
+        if(detailUnit!=null) {
+        	StringBuilder sb=new StringBuilder();
+			sb.append("课程:"+detailUnit.getPaper().getCourse().getName()+"("+detailUnit.getPaper().getCourse().getCode()+")");
+			sb.append(" 试卷名称:"+detailUnit.getPaper().getName()); 
+			sb.append(" 第"+detailUnit.getNumber()+"小题 ");
+			sb.append(changInfo);
+        	ReportsUtil.report(new AdminOperateReport(user.getRootOrgId(), user.getUserId(), "考试试卷管理-删除小题",sb.toString()));
+        }
     }
 
     /**

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

@@ -63,8 +63,8 @@ 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.converter.utils.FileUtil;
+import cn.com.qmth.examcloud.core.questions.base.enums.PaperSeqMode;
 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;
@@ -91,6 +91,7 @@ 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.DownloadPaperDto;
 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;
@@ -104,10 +105,14 @@ import cn.com.qmth.examcloud.core.questions.service.cache.QuestionAnswerCache;
 import cn.com.qmth.examcloud.core.questions.service.cache.QuestionCache;
 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.PaperUtil;
+import cn.com.qmth.examcloud.reports.commons.bean.AdminOperateReport;
+import cn.com.qmth.examcloud.reports.commons.util.ReportsUtil;
 import cn.com.qmth.examcloud.support.filestorage.FileStorageUtil;
 import cn.com.qmth.examcloud.web.config.SystemProperties;
 import cn.com.qmth.examcloud.web.filestorage.FileStoragePathEnvInfo;
 import cn.com.qmth.examcloud.web.filestorage.YunPathInfo;
+import cn.com.qmth.examcloud.web.support.SpringContextHolder;
 
 /**
  * @author chenken
@@ -222,6 +227,7 @@ public class PaperServiceImpl implements PaperService {
         query.limit(pageSize);
         query.skip((curPage - 1L) * pageSize);
         List<Paper> paperList = this.mongoTemplate.find(query, Paper.class);
+        setPaperQuesCountAndScore(paperList);
         return new PageImpl<Paper>(paperList, new PageRequest(curPage - 1, pageSize), count);
     }
 
@@ -376,6 +382,7 @@ public class PaperServiceImpl implements PaperService {
         query.limit(pageSize);
         query.skip((curPage - 1L) * pageSize);
         List<Paper> paperList = this.mongoTemplate.find(query, Paper.class);
+        setPaperQuesCountAndScore(paperList);
         return new PageImpl<Paper>(paperList, new PageRequest(curPage - 1, pageSize), count);
     }
 
@@ -465,7 +472,7 @@ public class PaperServiceImpl implements PaperService {
      * @param paperIds
      */
     @SuppressWarnings("unchecked")
-    public Map<String, Object> deletePapers(List<String> paperIds) {
+    public Map<String, Object> deletePapers(List<String> paperIds,User user) {
         Map<String, Object> msgMap = new HashMap<>();
         String msg = "";
         List<Paper> papers = CommonUtils.toList(paperRepo.findByIdIn(paperIds));
@@ -510,6 +517,17 @@ public class PaperServiceImpl implements PaperService {
             this.clearPaperCache(paperId);
         }
 
+        for(Paper paper:papers) {
+        	StringBuilder paperInfo=new StringBuilder();
+    		paperInfo.append("课程:"+paper.getCourse().getName()+"("+paper.getCourse().getCode()+")");
+    		paperInfo.append(" 试卷名称:"+paper.getName());
+    		if(PaperType.IMPORT.equals(paper.getPaperType())) {
+    			ReportsUtil.report(new AdminOperateReport(user.getRootOrgId(), user.getUserId(), "导入试卷管理-删除原卷",paperInfo.toString()));
+    		}else {
+    			ReportsUtil.report(new AdminOperateReport(user.getRootOrgId(), user.getUserId(), "考试试卷管理-删除试卷",paperInfo.toString()));
+        		
+    		}
+        }
         msg = "success";
         msgMap.put("msg", msg);
         return msgMap;
@@ -883,7 +901,11 @@ public class PaperServiceImpl implements PaperService {
      * @param questionId
      * @return
      */
-    public List<String> deleteImportQuestionById(String questionId, User user) {
+    public List<String> deleteImportQuestionById(String detailUnitId,String questionId, User user) {
+    	PaperDetailUnit paperDetailUnit=null;
+    	if(detailUnitId!=null) {
+    		paperDetailUnit = Model.of(paperDetailUnitRepo.findById(detailUnitId));
+    	}
         Question ques = Model.of(quesRepo.findById(questionId));
 
         List<PaperDetailUnit> pdus = CommonUtils.toList(paperDetailUnitRepo.findByQuestion(ques));
@@ -903,7 +925,7 @@ public class PaperServiceImpl implements PaperService {
                 }
             }
         }
-
+        String changInfo=null;
         if (paperNames.size() == 0) {
             needPdus.addAll(pdus);// 此试题没有被组卷调用,则可以删除此试题
             paperDetailUnitRepo.deleteAll(needPdus);
@@ -911,10 +933,26 @@ public class PaperServiceImpl implements PaperService {
             quesRepo.delete(ques);
 
             for (Paper paper : papers) {
-                formatPaper(paper, user);
+            	if(paperDetailUnit!=null&&paperDetailUnit.getPaper().getId().equals(paper.getId())) {
+            		Double total=paper.getTotalScore();
+                    Integer dc=paper.getPaperDetailCount();
+                    Integer uc=paper.getUnitCount();
+                    formatPaper(paper, user);
+                    changInfo=PaperUtil.getPaperChangeInfo(total, dc, uc, paper);
+            	}else {
+            		formatPaper(paper, user);
+            	}
             }
         }
 
+        if(paperDetailUnit!=null) {
+        	StringBuilder sb=new StringBuilder();
+			sb.append("课程:"+paperDetailUnit.getPaper().getCourse().getName()+"("+paperDetailUnit.getPaper().getCourse().getCode()+")");
+			sb.append(" 试卷名称:"+paperDetailUnit.getPaper().getName()); 
+			sb.append(" 第"+paperDetailUnit.getNumber()+"小题 ");
+			sb.append(changInfo);
+        	ReportsUtil.report(new AdminOperateReport(user.getRootOrgId(), user.getUserId(), "导入试卷管理-删除小题",sb.toString()));
+        }
         return paperNames;
     }
 
@@ -1011,7 +1049,20 @@ public class PaperServiceImpl implements PaperService {
         //清除缓存
         this.clearPaperCache(paper.getId());
 
+        Double total=paper.getTotalScore();
+        Integer dc=paper.getPaperDetailCount();
+        Integer uc=paper.getUnitCount();
         formatPaper(paper, user);
+        
+        StringBuilder paperInfo=new StringBuilder();
+        paperInfo.append("课程:"+paper.getCourse().getName()+"("+paper.getCourse().getCode()+")");
+        paperInfo.append(" 试卷名称:"+paper.getName());
+        paperInfo.append(" 第"+paperDetail.getNumber()+"大题选题题数:"+questions.size());
+        String changInfo=PaperUtil.getPaperChangeInfo(total, dc, uc, paper);
+    	if(changInfo!=null) {
+    		paperInfo.append(changInfo);
+    	}
+		ReportsUtil.report(new AdminOperateReport(user.getRootOrgId(), user.getUserId(), "考试试卷管理-选题",paperInfo.toString()));
         return paper;
     }
 
@@ -1046,11 +1097,12 @@ public class PaperServiceImpl implements PaperService {
         query.skip((curPage - 1L) * pageSize);
         List<Paper> paperList = this.mongoTemplate.find(query, Paper.class);
         Page<Paper> paperPageList = new PageImpl<Paper>(paperList, new PageRequest(curPage - 1, pageSize), total);
+        setPaperQuesCountAndScore(paperList);
         return paperPageList;
     }
 
     /**
-     * 将选中的导入试卷复制为卷库试
+     * 使用原
      */
     public void useBasePaper(String selectedPaperIds, String userId) {
         Assert.hasLength(selectedPaperIds, "试卷id不能为空!");
@@ -1058,6 +1110,11 @@ public class PaperServiceImpl implements PaperService {
         for (int i = 0; i < paperIds.length; i++) {
             Paper oldpaper = Model.of(paperRepo.findById(paperIds[i]));
             List<PaperDetail> paperDetails = paperDetailRepo.findByPaperOrderByNumber(oldpaper);
+            for (PaperDetail paperDetail:paperDetails) {
+            	List<PaperDetailUnit> paperDetailUnits = paperDetailUnitService.getUnitsByPaperDetail(paperDetail);
+            	paperDetail.setPaperDetailUnits(paperDetailUnits);
+            }
+//            PaperUtil.sortDetails(paperDetails);
             oldpaper.setId(null);
             SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
             String createTime = sdf.format(new Date());
@@ -1068,7 +1125,8 @@ public class PaperServiceImpl implements PaperService {
             Paper newPaper = paperRepo.save(oldpaper);
             for (int j = 0; j < paperDetails.size(); j++) {
                 PaperDetail paperDetail = paperDetails.get(j);
-                List<PaperDetailUnit> paperDetailUnits = paperDetailUnitService.getUnitsByPaperDetail(paperDetail);
+                paperDetail.setNumber(j+1);
+                List<PaperDetailUnit> paperDetailUnits = paperDetail.getPaperDetailUnits();
                 paperDetail.setPaper(newPaper);//关联新Paper
                 paperDetail.setId(null);
                 paperDetail.setCreateTime(createTime);
@@ -1481,8 +1539,11 @@ public class PaperServiceImpl implements PaperService {
     @Override
     public String findQuestionStructure(String paperId) throws Exception {
         //根据paperId查询新的对象
-        ExportPaperAbstractService exportPaperAbstractService = (ExportPaperAbstractService) SpringContextUtils.getBeanById("sxsfExportPaperService");
-        PaperExp paperExp = exportPaperAbstractService.initPaperExp(paperId);
+        ExportPaperAbstractService exportPaperAbstractService = (ExportPaperAbstractService)SpringContextHolder.getBean("exportPaperAbstractService");
+        DownloadPaperDto dto=new DownloadPaperDto();
+        dto.setPaperId(paperId);
+    	dto.setSeqMode(PaperSeqMode.MODE3);
+        PaperExp paperExp = exportPaperAbstractService.initPaperExp(dto);
         log.info("已经获取试卷");
         //得到试卷中的客观大题
         List<PaperDetailExp> objectiveDetails = exportPaperAbstractService.getAllObjectiveDetails(paperExp);
@@ -1569,7 +1630,7 @@ public class PaperServiceImpl implements PaperService {
     }
 
     @Override
-    public PaperExp getDownPaperExp(String paperId) throws Exception {
+    public PaperExp getDownPaperExp(String paperId) {
         Paper paper = Model.of(paperRepo.findById(paperId));
         // 创建paperDto
         PaperExp paperExp = BeanCopierUtil.copyProperties(paper, PaperExp.class);
@@ -1613,6 +1674,9 @@ public class PaperServiceImpl implements PaperService {
             // 大题序号
             paperDetail.setNumber(++mainNum);
             paperDetail.setCnNum(CommonUtils.toCHNum(paperDetail.getNumber()));
+            if(paperDetail.getPaperDetailUnits() == null || paperDetail.getPaperDetailUnits().size()==0) {
+            	throw new StatusException("500", "第"+mainNum+"大题没有小题");
+            }
             if (paperDetail != null && paperDetail.getPaperDetailUnits() != null && paperDetail.getPaperDetailUnits().size() > 0) {
                 int minNum = 1;
                 for (PaperDetailUnitExp paperDetailUnit : paperDetail.getPaperDetailUnits()) {
@@ -2203,4 +2267,64 @@ public class PaperServiceImpl implements PaperService {
 		}
 		return Integer.valueOf(s.trim());
 	}
+	
+	private void setPaperQuesCountAndScore(List<Paper> paperList) {
+		if(paperList==null||paperList.size()==0) {
+			return;
+		}
+		for(Paper paper:paperList) {
+			initQuesCountAndScore(paper);
+			Map<String, Integer> quesCount=paper.getQuesCount();
+			Map<String, Double> quesScore=paper.getQuesScore();
+			List<PaperDetailUnit> units = paperDetailUnitRepo.findByPaperOrderByNumber(paper);
+	        if (units != null && units.size() > 0) {
+	            for (PaperDetailUnit unit : units) {
+	                if (unit.getQuestion().getPublicity() == null) {
+	                    unit.getQuestion().setPublicity(true);
+	                }
+	                if (unit.getQuestion().getDifficulty() == null) {
+	                    unit.getQuestion().setDifficulty("中");
+	                }
+	                String key = getKey(unit.getQuestion().getPublicity(),unit.getQuestion().getDifficulty());
+                	quesCount.put(key, quesCount.get(key)+1);
+	                quesScore.put(key, BigDecimal.valueOf(quesScore.get(key)).add(BigDecimal.valueOf(unit.getScore())).doubleValue());
+	            }
+	        }
+		}
+	}
+	
+	private String getKey(Boolean publicity,String difficultyType) {
+        String difficulty = null;
+        if ("易".equals(difficultyType)) {
+            difficulty = "1";
+        } else if ("中".equals(difficultyType)) {
+            difficulty = "2";
+        } else {
+            difficulty = "3";
+        }
+        if(publicity==null||publicity) {
+        	return "1-"+difficulty;
+        }else {
+        	return "0-"+difficulty;
+        }
+	}
+	
+	private void initQuesCountAndScore(Paper paper) {
+		Map<String, Integer> quesCount=new HashMap<>();
+		quesCount.put("0-1", 0);
+		quesCount.put("0-2", 0);
+		quesCount.put("0-3", 0);
+		quesCount.put("1-1", 0);
+		quesCount.put("1-2", 0);
+		quesCount.put("1-3", 0);
+		Map<String, Double> quesScore=new HashMap<>();
+		quesScore.put("0-1", 0.0);
+		quesScore.put("0-2", 0.0);
+		quesScore.put("0-3", 0.0);
+		quesScore.put("1-1", 0.0);
+		quesScore.put("1-2", 0.0);
+		quesScore.put("1-3", 0.0);
+		paper.setQuesCount(quesCount);
+		paper.setQuesScore(quesScore);
+	}
 }

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

@@ -196,8 +196,6 @@ public class ExportPaperUtil {
         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();
@@ -297,7 +295,7 @@ public class ExportPaperUtil {
     }
 
     // 原始试卷
-    public static File createOriginPaperDocFile(PaperExp paperExp, File directory) throws Exception {
+    public static File createOriginPaperDocFile(PaperExp paperExp, File directory) throws IOException{
         // doc固定源文件目录
         File docxDir = new File(docxBasePath);
         // 将要生成的doc源文件目录
@@ -455,7 +453,6 @@ public class ExportPaperUtil {
         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();
@@ -542,10 +539,9 @@ public class ExportPaperUtil {
                 slist1.add(sec);
             }
             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() + ".");
+                se.setValue(qes.getQuestionSeq() + ".");
                 slist1.get(0).getElements().add(0, se);
             }
 
@@ -587,7 +583,6 @@ public class ExportPaperUtil {
             qes.setQuesAnswerWord(getQuestionDoc(slist3));
 
             if (qes.getSubQuestions() != null && qes.getSubQuestions().size() > 0) {
-                dto.setSubNum(0);
                 for (Question sunqes : qes.getSubQuestions()) {
                     disposeQuestion(sunqes, dto);// 递归处理套题
                 }
@@ -610,9 +605,6 @@ public class ExportPaperUtil {
 
     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) {
@@ -625,7 +617,7 @@ public class ExportPaperUtil {
             if (qes.getSubQuestions() == null || qes.getSubQuestions().size() == 0) {// 套题题干不加题号
                 SectionElement se = new SectionElement();
                 se.setType(ELEMENT_TYPE_TEXT);
-                se.setValue(dto.getSubNum() + ".");
+                se.setValue(qes.getQuestionSeq() + ".");
                 slist1.get(0).getElements().add(0, se);
             }
 
@@ -658,7 +650,6 @@ public class ExportPaperUtil {
             
             //处理答案
             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) {
                     slist3=new ArrayList<JSection>();
@@ -669,7 +660,7 @@ public class ExportPaperUtil {
                 }
                 SectionElement se = new SectionElement();
                 se.setType(ELEMENT_TYPE_TEXT);
-                se.setValue(dto.getAnswerNum() + ".");
+                se.setValue(qes.getQuestionSeq() + ".");
                 slist3.get(0).getElements().add(0, se);
 
                 htmlToDoc(slist3, dto);
@@ -678,8 +669,6 @@ public class ExportPaperUtil {
             
 
             if (qes.getSubQuestions() != null && qes.getSubQuestions().size() > 0) {
-                dto.setSubNum(0);
-                dto.setAnswerNum(0);
                 for (Question sunqes : qes.getSubQuestions()) {
                     disposePaperQuestion(sunqes, dto);// 递归处理套题
                 }

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

@@ -0,0 +1,417 @@
+package cn.com.qmth.examcloud.core.questions.service.util;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import cn.com.qmth.examcloud.core.questions.base.enums.PaperSeqMode;
+import cn.com.qmth.examcloud.core.questions.base.question.enums.QuesStructType;
+import cn.com.qmth.examcloud.core.questions.dao.ExportServiceManageRepo;
+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.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.export.ExportPaperAbstractService;
+import cn.com.qmth.examcloud.web.support.SpringContextHolder;
+
+public class PaperUtil {
+
+	private static ExportServiceManageRepo exportServiceManageRepo = SpringContextHolder
+			.getBean(ExportServiceManageRepo.class);
+
+	public static ExportPaperAbstractService getByServiceName(String serviceName) {
+		if (SpringContextHolder.containsBean(serviceName)) {
+			return (ExportPaperAbstractService) SpringContextHolder.getBean(serviceName);
+		}
+		return (ExportPaperAbstractService) SpringContextHolder.getBean("exportPaperAbstractService");
+
+	}
+
+	public static ExportPaperAbstractService getByRootOrgId(String rootOrgId) {
+		ExportServiceManage esm = exportServiceManageRepo.findByOrgId(rootOrgId);
+		if (esm == null) {
+			return (ExportPaperAbstractService) SpringContextHolder.getBean("exportPaperAbstractService");
+		} else {
+			if (SpringContextHolder.containsBean(esm.getExportServiceName())) {
+				return (ExportPaperAbstractService) SpringContextHolder.getBean(esm.getExportServiceName());
+			}
+			return (ExportPaperAbstractService) SpringContextHolder.getBean("exportPaperAbstractService");
+		}
+	}
+
+	public static void setQuestionSeq(List<PaperDetailExp> paperDetailExps, PaperSeqMode seqMode) {
+		if (paperDetailExps == null || paperDetailExps.size() == 0) {
+			return;
+		}
+		if (PaperSeqMode.MODE1.equals(seqMode)) {
+			setQuestionSeqMode1(paperDetailExps);
+		} else if (PaperSeqMode.MODE2.equals(seqMode)) {
+			setQuestionSeqMode2(paperDetailExps);
+		} else if (PaperSeqMode.MODE4.equals(seqMode)) {
+			setQuestionSeqMode4(paperDetailExps);
+		} else {
+			setQuestionSeqMode3(paperDetailExps);
+		}
+	}
+
+	private static void disposeQuestion(List<PaperDetailExp> paperDetailExps) {
+		for (PaperDetailExp paperDetail : paperDetailExps) {
+			boolean nested = false;
+			Set<Long> questionTypes = new HashSet<>();
+			for (PaperDetailUnitExp paperDetailUnit : paperDetail.getPaperDetailUnits()) {
+				// 如果是套题
+				if (paperDetailUnit.getQuestionType().getName().equals("套题")) {
+					nested = true;
+					questionTypes.add(getTypeForNestedQuestion(paperDetailUnit));
+				} else {
+					Long questionTypeId = paperDetailUnit.getQuestionType().getId();
+					questionTypes.add(questionTypeId);
+				}
+			}
+			paperDetail.setQuestionTypes(new ArrayList<>(questionTypes));
+			paperDetail.setNested(nested);
+		}
+	}
+
+	private static void setQuestionSeqMode1(List<PaperDetailExp> paperDetailExps) {
+		disposeQuestion(paperDetailExps);
+		Map<Long, Integer> objectiveSeqMap = new HashMap<>();
+		for (PaperDetailExp paperDetail : paperDetailExps) {
+			int subjectiveSeq = 0;
+			if (paperDetail.getQuestionTypes().size() == 1) {
+				Long type = paperDetail.getQuestionTypes().get(0);
+				if (QuesStructType.SINGLE_ANSWER_QUESTION.getId().longValue() == type.longValue()
+						|| QuesStructType.MULTIPLE_ANSWER_QUESTION.getId().longValue() == type.longValue()
+						|| QuesStructType.BOOL_ANSWER_QUESTION.getId().longValue() == type.longValue()) {// 客观题
+					Integer objectiveSeq = objectiveSeqMap.get(type);
+					if (objectiveSeq == null) {
+						objectiveSeq = 0;
+					}
+					for (PaperDetailUnitExp unit : paperDetail.getPaperDetailUnits()) {
+						if (unit.getQuestion().getSubQuestions() != null
+								&& unit.getQuestion().getSubQuestions().size() > 0) {// 套题
+							for (Question ques : unit.getQuestion().getSubQuestions()) {
+								objectiveSeq++;
+								ques.setQuestionSeq(objectiveSeq);
+							}
+						} else {
+							objectiveSeq++;
+							unit.getQuestion().setQuestionSeq(objectiveSeq);
+						}
+					}
+					objectiveSeqMap.put(type, objectiveSeq);
+				} else {
+					for (PaperDetailUnitExp unit : paperDetail.getPaperDetailUnits()) {
+						if (unit.getQuestion().getSubQuestions() != null
+								&& unit.getQuestion().getSubQuestions().size() > 0) {// 套题
+							for (Question ques : unit.getQuestion().getSubQuestions()) {
+								subjectiveSeq++;
+								ques.setQuestionSeq(subjectiveSeq);
+							}
+						} else {
+							subjectiveSeq++;
+							unit.getQuestion().setQuestionSeq(subjectiveSeq);
+						}
+					}
+				}
+			} else {// 混合型大题
+				for (PaperDetailUnitExp unit : paperDetail.getPaperDetailUnits()) {
+					if (unit.getQuestion().getSubQuestions() != null
+							&& unit.getQuestion().getSubQuestions().size() > 0) {// 套题
+						for (Question ques : unit.getQuestion().getSubQuestions()) {
+							subjectiveSeq++;
+							ques.setQuestionSeq(subjectiveSeq);
+						}
+					} else {
+						subjectiveSeq++;
+						unit.getQuestion().setQuestionSeq(subjectiveSeq);
+					}
+				}
+			}
+		}
+	}
+
+	private static void setQuestionSeqMode2(List<PaperDetailExp> paperDetailExps) {
+		disposeQuestion(paperDetailExps);
+		int objectiveSeq = 0;
+		for (PaperDetailExp paperDetail : paperDetailExps) {
+			int subjectiveSeq = 0;
+			if (paperDetail.getQuestionTypes().size() == 1) {
+				Long type = paperDetail.getQuestionTypes().get(0);
+				if (QuesStructType.SINGLE_ANSWER_QUESTION.getId().longValue() == type.longValue()
+						|| QuesStructType.MULTIPLE_ANSWER_QUESTION.getId().longValue() == type.longValue()
+						|| QuesStructType.BOOL_ANSWER_QUESTION.getId().longValue() == type.longValue()) {// 客观题
+					for (PaperDetailUnitExp unit : paperDetail.getPaperDetailUnits()) {
+						if (unit.getQuestion().getSubQuestions() != null
+								&& unit.getQuestion().getSubQuestions().size() > 0) {// 套题
+							for (Question ques : unit.getQuestion().getSubQuestions()) {
+								objectiveSeq++;
+								ques.setQuestionSeq(objectiveSeq);
+							}
+						} else {
+							objectiveSeq++;
+							unit.getQuestion().setQuestionSeq(objectiveSeq);
+						}
+					}
+				} else {
+					for (PaperDetailUnitExp unit : paperDetail.getPaperDetailUnits()) {
+						if (unit.getQuestion().getSubQuestions() != null
+								&& unit.getQuestion().getSubQuestions().size() > 0) {// 套题
+							for (Question ques : unit.getQuestion().getSubQuestions()) {
+								subjectiveSeq++;
+								ques.setQuestionSeq(subjectiveSeq);
+							}
+						} else {
+							subjectiveSeq++;
+							unit.getQuestion().setQuestionSeq(subjectiveSeq);
+						}
+					}
+				}
+			} else {// 混合型大题
+				for (PaperDetailUnitExp unit : paperDetail.getPaperDetailUnits()) {
+					if (unit.getQuestion().getSubQuestions() != null
+							&& unit.getQuestion().getSubQuestions().size() > 0) {// 套题
+						for (Question ques : unit.getQuestion().getSubQuestions()) {
+							subjectiveSeq++;
+							ques.setQuestionSeq(subjectiveSeq);
+						}
+					} else {
+						subjectiveSeq++;
+						unit.getQuestion().setQuestionSeq(subjectiveSeq);
+					}
+				}
+			}
+		}
+	}
+
+	private static void setQuestionSeqMode3(List<PaperDetailExp> paperDetailExps) {
+		for (PaperDetailExp paperDetail : paperDetailExps) {
+			int seq = 0;
+			for (PaperDetailUnitExp unit : paperDetail.getPaperDetailUnits()) {
+				if (unit.getQuestion().getSubQuestions() != null && unit.getQuestion().getSubQuestions().size() > 0) {// 套题
+					for (Question ques : unit.getQuestion().getSubQuestions()) {
+						seq++;
+						ques.setQuestionSeq(seq);
+					}
+				} else {
+					seq++;
+					unit.getQuestion().setQuestionSeq(seq);
+				}
+			}
+		}
+	}
+	
+	private static void setQuestionSeqMode4(List<PaperDetailExp> paperDetailExps) {
+		for (PaperDetailExp paperDetail : paperDetailExps) {
+			int seq = 0;
+			for (PaperDetailUnitExp unit : paperDetail.getPaperDetailUnits()) {
+				if (unit.getQuestion().getSubQuestions() != null && unit.getQuestion().getSubQuestions().size() > 0) {// 套题
+					int subseq = 0;
+					for (Question ques : unit.getQuestion().getSubQuestions()) {
+						subseq++;
+						ques.setQuestionSeq(subseq);
+					}
+				} else {
+					seq++;
+					unit.getQuestion().setQuestionSeq(seq);
+				}
+			}
+		}
+	}
+
+	public static List<PaperDetailExp> sortPaperDetailExps(List<PaperDetailExp> paperDetailExps) {
+		if (paperDetailExps == null || paperDetailExps.size() == 0) {
+			return null;
+		}
+		for (PaperDetailExp paperDetail : paperDetailExps) {
+			boolean nested = false;
+			Set<Long> questionTypes = new HashSet<>();
+			for (PaperDetailUnitExp paperDetailUnit : paperDetail.getPaperDetailUnits()) {
+				// 如果是套题
+				if (paperDetailUnit.getQuestionType().getName().equals("套题")) {
+					nested = true;
+					questionTypes.add(getTypeForNestedQuestion(paperDetailUnit));
+				} else {
+					Long questionTypeId = paperDetailUnit.getQuestionType().getId();
+					questionTypes.add(questionTypeId);
+				}
+			}
+			paperDetail.setQuestionTypes(new ArrayList<>(questionTypes));
+			paperDetail.setNested(nested);
+		}
+
+		Map<Long, List<PaperDetailExp>> baseMap = new LinkedHashMap<>();
+
+		Map<Long, List<PaperDetailExp>> objectiveNestedMap = new HashMap<>();
+
+		int index = 0;
+
+		for (PaperDetailExp paperDetail : paperDetailExps) {
+			index++;
+			if (paperDetail.getQuestionTypes().size() == 1) {
+				Long type = paperDetail.getQuestionTypes().get(0);
+				if (QuesStructType.SINGLE_ANSWER_QUESTION.getId().longValue() == type.longValue()
+						|| QuesStructType.MULTIPLE_ANSWER_QUESTION.getId().longValue() == type.longValue()
+						|| QuesStructType.BOOL_ANSWER_QUESTION.getId().longValue() == type.longValue()) {// 客观题
+					List<PaperDetailExp> list = baseMap.get(type);
+					if (list == null) {
+						list = new ArrayList<>();
+						baseMap.put(type, list);
+					}
+					if (paperDetail.isNested()) {// 套题类客观题
+						List<PaperDetailExp> nestedlist = objectiveNestedMap.get(type);
+						if (nestedlist == null) {
+							nestedlist = new ArrayList<>();
+							objectiveNestedMap.put(type, nestedlist);
+						}
+						nestedlist.add(paperDetail);
+					} else {
+						list.add(paperDetail);
+					}
+				} else {
+					List<PaperDetailExp> list = new ArrayList<>();
+					list.add(paperDetail);
+					baseMap.put(100L + index, list);
+				}
+			} else {// 混合型大题
+				List<PaperDetailExp> list = new ArrayList<>();
+				list.add(paperDetail);
+				baseMap.put(100L + index, list);
+			}
+		}
+		if (objectiveNestedMap.size() > 0) {
+			for (Long type : objectiveNestedMap.keySet()) {
+				baseMap.get(type).addAll(objectiveNestedMap.get(type));
+			}
+		}
+
+		List<PaperDetailExp> ret = new ArrayList<>();
+		for (List<PaperDetailExp> pds : baseMap.values()) {
+			pds.get(0).setResetSubQuesSeq(true);
+			ret.addAll(pds);
+		}
+		return ret;
+	}
+
+	public static void sortDetails(List<PaperDetail> paperDetails) {
+		for (PaperDetail paperDetail : paperDetails) {
+			boolean nested = false;
+			Set<Long> questionTypes = new HashSet<>();
+			for (PaperDetailUnit paperDetailUnit : paperDetail.getPaperDetailUnits()) {
+				// 如果是套题
+				if (paperDetailUnit.getQuestionType().getName().equals("套题")) {
+					nested = true;
+					questionTypes.add(getTypeForNestedQuestion(paperDetailUnit));
+				} else {
+					Long questionTypeId = paperDetailUnit.getQuestionType().getId();
+					questionTypes.add(questionTypeId);
+				}
+			}
+			// 如果全是同样的类型
+			if (questionTypes.size() == 1) {
+				for (Long l : questionTypes) {
+					paperDetail.setSortNumber(l);
+				}
+			} else {
+				paperDetail.setSortNumber(7L);
+			}
+			if (nested) {
+				paperDetail.setSortNumberSub(2);
+			} else {
+				paperDetail.setSortNumberSub(1);
+			}
+		}
+		Collections.sort(paperDetails, new Comparator<PaperDetail>() {
+			@Override
+			public int compare(PaperDetail o1, PaperDetail o2) {
+				if (o1.getSortNumber() > o2.getSortNumber()) {
+					return 1;
+				} else if (o1.getSortNumber() < o2.getSortNumber()) {
+					return -1;
+				} else {
+					if (o1.getSortNumberSub() > o2.getSortNumberSub()) {
+						return 1;
+					} else if (o1.getSortNumberSub() < o2.getSortNumberSub()) {
+						return -1;
+					} else {
+						return 0;
+					}
+				}
+
+			}
+		});
+		if (paperDetails != null && paperDetails.size() > 0) {
+			// 循环所有大题,给小题重设题号
+			int number = 0;
+			for (PaperDetail paperDetail : paperDetails) {
+				for (PaperDetailUnit paperDetailUnit : paperDetail.getPaperDetailUnits()) {
+					number++;
+					paperDetailUnit.setNumber(number);
+				}
+			}
+		}
+	}
+
+	private static Long getTypeForNestedQuestion(PaperDetailUnitExp paperDetailUnit) {
+		// 得到套题下面所有小题
+		List<Question> questions = paperDetailUnit.getQuestion().getSubQuestions();
+		Set<Long> subQuestionType = new HashSet<>();
+		for (Question subQuestion : questions) {
+			subQuestionType.add(subQuestion.getQuestionType().getId());
+		}
+		// 如果全是同样的类型
+		if (subQuestionType.size() == 1) {
+			for (Long l : subQuestionType) {
+				return l;
+			}
+			return null;
+		} else {
+			return paperDetailUnit.getQuestionType().getId();
+		}
+	}
+
+	private static Long getTypeForNestedQuestion(PaperDetailUnit paperDetailUnit) {
+		// 得到套题下面所有小题
+		List<Question> questions = paperDetailUnit.getQuestion().getSubQuestions();
+		Set<Long> subQuestionType = new HashSet<>();
+		for (Question subQuestion : questions) {
+			subQuestionType.add(subQuestion.getQuestionType().getId());
+		}
+		// 如果全是同样的类型
+		if (subQuestionType.size() == 1) {
+			for (Long l : subQuestionType) {
+				return l;
+			}
+			return null;
+		} else {
+			return paperDetailUnit.getQuestionType().getId();
+		}
+	}
+
+	public static String getPaperChangeInfo(Double total, Integer dc, Integer uc, Paper now) {
+		StringBuilder sb = new StringBuilder();
+		if (total.doubleValue() != now.getTotalScore().doubleValue()) {
+			sb.append(" 试卷总分变动(" + total + "变为" + now.getTotalScore() + ")");
+		}
+		if (dc.intValue() != now.getPaperDetailCount().intValue()) {
+			sb.append(" 试卷大题数量变动(" + dc + "变为" + now.getPaperDetailCount() + ")");
+		}
+		if (uc.intValue() != now.getUnitCount().intValue()) {
+			sb.append(" 试卷小题数量变动(" + uc + "变为" + now.getUnitCount() + ")");
+		}
+		if (sb.length() == 0) {
+			return null;
+		}
+		return sb.toString();
+	}
+
+}

+ 1 - 1
examcloud-core-questions-starter/src/main/java/cn/com/qmth/examcloud/core/questions/starter/CoreQuestionApp.java

@@ -38,7 +38,7 @@ public class CoreQuestionApp {
     static {
         String runtimeLevel = System.getProperty("log.commonLevel");
         if (null == runtimeLevel) {
-            System.setProperty("log.commonLevel", "DEBUG");
+            System.setProperty("log.commonLevel", "INFO");
         }
         System.setProperty("hibernate.dialect.storage_engine", "innodb");
     }

+ 23 - 5
examcloud-core-questions-starter/src/main/java/cn/com/qmth/examcloud/core/questions/starter/config/ExamCloudResourceManager.java

@@ -7,14 +7,15 @@
 
 package cn.com.qmth.examcloud.core.questions.starter.config;
 
-import cn.com.qmth.examcloud.api.commons.security.bean.AccessApp;
-import cn.com.qmth.examcloud.api.commons.security.bean.Role;
-import cn.com.qmth.examcloud.api.commons.security.bean.User;
-import cn.com.qmth.examcloud.api.commons.security.bean.UserType;
+import cn.com.qmth.examcloud.api.commons.enums.DataRuleType;
+import cn.com.qmth.examcloud.api.commons.security.bean.*;
 import cn.com.qmth.examcloud.api.commons.security.enums.RoleMeta;
 import cn.com.qmth.examcloud.commons.util.PathUtil;
 import cn.com.qmth.examcloud.commons.util.PropertiesUtil;
 import cn.com.qmth.examcloud.commons.util.RegExpUtil;
+import cn.com.qmth.examcloud.core.basic.api.UserDataRuleCloudService;
+import cn.com.qmth.examcloud.core.basic.api.request.QueryUserDataRuleReq;
+import cn.com.qmth.examcloud.core.basic.api.response.QueryUserDataRuleResp;
 import cn.com.qmth.examcloud.support.cache.CacheHelper;
 import cn.com.qmth.examcloud.support.cache.bean.AppCacheBean;
 import cn.com.qmth.examcloud.web.redis.RedisClient;
@@ -31,9 +32,13 @@ import java.util.Set;
 
 @Component
 public class ExamCloudResourceManager implements ResourceManager {
+
     @Autowired
     private RedisClient redisClient;
 
+    @Autowired
+    private UserDataRuleCloudService userDataRuleCloudService;
+
     static {
         PropertiesUtil.loadFromPath(PathUtil.getResoucePath("security.properties"));
     }
@@ -126,4 +131,17 @@ public class ExamCloudResourceManager implements ResourceManager {
         return false;
     }
 
-}
+    @Override
+    public UserDataRule loadUserDataRule(Long userId, DataRuleType dataRuleType) {
+        QueryUserDataRuleReq req = new QueryUserDataRuleReq();
+        req.setUserId(userId);
+        req.setType(dataRuleType);
+        QueryUserDataRuleResp resp = userDataRuleCloudService.queryUserDataRule(req);
+
+        UserDataRule userDataRule = new UserDataRule();
+        userDataRule.setGlobalStatus(resp.getGlobalStatus());
+        userDataRule.setRefIds(resp.getRefIds());
+        return userDataRule;
+    }
+
+}

+ 20 - 20
examcloud-core-questions-starter/src/main/java/cn/com/qmth/examcloud/core/questions/starter/config/ExamCloudWebMvcConfigurer.java

@@ -11,6 +11,7 @@ import cn.com.qmth.examcloud.web.interceptor.ApiFlowLimitedInterceptor;
 import cn.com.qmth.examcloud.web.interceptor.ApiStatisticInterceptor;
 import cn.com.qmth.examcloud.web.interceptor.FirstInterceptor;
 import cn.com.qmth.examcloud.web.redis.RedisClient;
+import cn.com.qmth.examcloud.web.security.DataRuleInterceptor;
 import cn.com.qmth.examcloud.web.security.RequestPermissionInterceptor;
 import cn.com.qmth.examcloud.web.security.ResourceManager;
 import cn.com.qmth.examcloud.web.security.RpcInterceptor;
@@ -22,31 +23,30 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
 @Configuration
 public class ExamCloudWebMvcConfigurer implements WebMvcConfigurer {
-	@Autowired
-	private ResourceManager resourceManager;
 
-	@Autowired
-	private RedisClient redisClient;
+    @Autowired
+    private ResourceManager resourceManager;
 
-	@Override
-	public void addInterceptors(InterceptorRegistry registry) {
+    @Autowired
+    private RedisClient redisClient;
 
-		registry.addInterceptor(new FirstInterceptor()).addPathPatterns("/**");
-		registry.addInterceptor(new ApiFlowLimitedInterceptor()).addPathPatterns("/**");
-		registry.addInterceptor(new RpcInterceptor(resourceManager)).addPathPatterns("/**");
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        registry.addInterceptor(new FirstInterceptor()).addPathPatterns("/**");
+        registry.addInterceptor(new ApiFlowLimitedInterceptor()).addPathPatterns("/**");
+        registry.addInterceptor(new RpcInterceptor(resourceManager)).addPathPatterns("/**");
 
-		RequestPermissionInterceptor permissionInterceptor = new RequestPermissionInterceptor(
-				resourceManager, redisClient);
-		registry.addInterceptor(permissionInterceptor).addPathPatterns("/**");
+        RequestPermissionInterceptor permissionInterceptor = new RequestPermissionInterceptor(resourceManager, redisClient);
+        registry.addInterceptor(permissionInterceptor).addPathPatterns("/**");
+        registry.addInterceptor(new ApiStatisticInterceptor()).addPathPatterns("/**");
 
-		registry.addInterceptor(new ApiStatisticInterceptor()).addPathPatterns("/**");
-	}
+        registry.addInterceptor(new DataRuleInterceptor(resourceManager)).addPathPatterns("/api/**");
+    }
 
-	@Override
-	public void addCorsMappings(CorsRegistry registry) {
-		registry.addMapping("/**").allowedOrigins("*").allowCredentials(false).allowedMethods("*")
-				.maxAge(3600);
-
-	}
+    @Override
+    public void addCorsMappings(CorsRegistry registry) {
+        registry.addMapping("/**").allowedOrigins("*").allowCredentials(false).allowedMethods("*")
+                .maxAge(3600);
+    }
 
 }