浏览代码

maser后端代码提交

weiwenhai 6 年之前
父节点
当前提交
3b4b5dff84
共有 24 个文件被更改,包括 2495 次插入320 次删除
  1. 22 5
      examcloud-core-questions-api-provider/src/main/java/cn/com/qmth/examcloud/core/questions/api/provider/ExtractConfigCloudServiceProvider.java
  2. 30 11
      examcloud-core-questions-api-provider/src/main/java/cn/com/qmth/examcloud/service/core/api/CoursePropertyController.java
  3. 14 0
      examcloud-core-questions-api-provider/src/main/java/cn/com/qmth/examcloud/service/core/api/ExportPaperController.java
  4. 0 17
      examcloud-core-questions-api-provider/src/main/java/cn/com/qmth/examcloud/service/core/api/PaperController.java
  5. 1425 0
      examcloud-core-questions-base/src/main/resources/original_paper.ftl
  6. 3 1
      examcloud-core-questions-dao/src/main/java/cn/com/qmth/examcloud/core/questions/dao/CoursePropertyRepo.java
  7. 2 0
      examcloud-core-questions-dao/src/main/java/cn/com/qmth/examcloud/core/questions/dao/QuesRepo.java
  8. 5 5
      examcloud-core-questions-dao/src/main/java/cn/com/qmth/examcloud/core/questions/dao/entity/PaperDetailStruct.java
  9. 61 0
      examcloud-core-questions-dao/src/main/java/cn/com/qmth/examcloud/core/questions/dao/entity/dto/PaperDetailUnitStructDto.java
  10. 16 2
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/CoursePropertyService.java
  11. 10 0
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/ExportPaperService.java
  12. 9 0
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/ExtractConfigProviderService.java
  13. 7 0
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/PaperService.java
  14. 87 4
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/PaperStructService.java
  15. 10 8
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/bean/dto/GenPaperDto.java
  16. 102 0
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/bean/dto/NumberDto.java
  17. 36 9
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/bean/dto/PaperDetailExp.java
  18. 40 0
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/bean/dto/PaperDetailUnitExp.java
  19. 4 0
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/ExportPaperAbstractService.java
  20. 32 2
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/impl/CoursePropertyServiceImpl.java
  21. 60 0
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/impl/ExportPaperServiceImpl.java
  22. 22 5
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/impl/ExtractConfigProviderServiceImpl.java
  23. 286 248
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/impl/GenPaperService.java
  24. 212 3
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/impl/PaperServiceImpl.java

+ 22 - 5
examcloud-core-questions-api-provider/src/main/java/cn/com/qmth/examcloud/core/questions/api/provider/ExtractConfigCloudServiceProvider.java

@@ -1,6 +1,7 @@
 package cn.com.qmth.examcloud.core.questions.api.provider;
 
 import java.util.Map;
+import java.util.Set;
 
 import io.swagger.annotations.ApiOperation;
 
@@ -16,9 +17,11 @@ import cn.com.qmth.examcloud.commons.base.exception.StatusException;
 import cn.com.qmth.examcloud.core.questions.api.ExtractConfigCloudService;
 import cn.com.qmth.examcloud.core.questions.api.request.GetBasePaperReq;
 import cn.com.qmth.examcloud.core.questions.api.request.GetPaperReq;
+import cn.com.qmth.examcloud.core.questions.api.request.GetQuestionListReq;
 import cn.com.qmth.examcloud.core.questions.api.request.GetQuestionReq;
 import cn.com.qmth.examcloud.core.questions.api.response.GetBasePaperResp;
 import cn.com.qmth.examcloud.core.questions.api.response.GetPaperResp;
+import cn.com.qmth.examcloud.core.questions.api.response.GetQuestionListResp;
 import cn.com.qmth.examcloud.core.questions.api.response.GetQuestionResp;
 import cn.com.qmth.examcloud.core.questions.service.ExtractConfigProviderService;
 import cn.com.qmth.examcloud.question.core.paper.DefaultPaper;
@@ -72,19 +75,19 @@ public class ExtractConfigCloudServiceProvider implements ExtractConfigCloudServ
 	public GetQuestionResp getQuestion(@RequestBody GetQuestionReq questionReq) {
 		Long examId = questionReq.getExamId();
 		if (null == examId) {
-			throw new StatusException("Q-010074", "examId is null");
+			throw new StatusException("Q-010077", "examId is null");
 		}
 		String courseCode = questionReq.getCourseCode(); 
 		if(StringUtils.isBlank(courseCode)){
-			throw new StatusException("Q-010079", "courseCode is null");
+			throw new StatusException("Q-010081", "courseCode is null");
 		}
 		String groupCode = questionReq.getGroupCode();
 		if(StringUtils.isBlank(groupCode)){
-			throw new StatusException("Q-010083", "groupCode is null");
+			throw new StatusException("Q-010085", "groupCode is null");
 		}
 		String questionId = questionReq.getQuestionId();
 		if(StringUtils.isBlank(questionId)){
-			throw new StatusException("Q-010087", "questionId is null");
+			throw new StatusException("Q-010089", "questionId is null");
 		}
 		DefaultQuestion defaultQuestion = extractConfigExamService.getDefaultQuestion(examId, courseCode, groupCode, questionId);
 		GetQuestionResp resp = new GetQuestionResp();
@@ -99,12 +102,26 @@ public class ExtractConfigCloudServiceProvider implements ExtractConfigCloudServ
 	public GetBasePaperResp getBasePaper(@RequestBody GetBasePaperReq req) {
 		String paperId = req.getPaperId();
 		if (null == paperId) {
-			throw new StatusException("Q-010102", "paperId is null");
+			throw new StatusException("Q-010104", "paperId is null");
 		}
 		DefaultPaper defaultPaper = extractConfigExamService.getBaseDefaultPaper(paperId);
 		GetBasePaperResp resp = new GetBasePaperResp();
 		resp.setDefaultPaper(defaultPaper);
 		return resp;
 	}
+
+	@ApiOperation(value = "根据试题id集合获取试题集合")
+	@PostMapping("getQuestionList")
+	@Override
+	public GetQuestionListResp getQuestionList(@RequestBody GetQuestionListReq req) {
+		Set<String> questionIds = req.getQuestionIds();
+		if(questionIds == null || questionIds.size()<1){
+			throw new StatusException("Q-010119", "questionIds is null");
+		}
+		Map<String, DefaultQuestion> map = extractConfigExamService.getDefaultQuestions(questionIds);
+		GetQuestionListResp resp = new GetQuestionListResp();
+		resp.setMap(map);
+		return resp;
+	}
 	
 }

+ 30 - 11
examcloud-core-questions-api-provider/src/main/java/cn/com/qmth/examcloud/service/core/api/CoursePropertyController.java

@@ -3,6 +3,8 @@ package cn.com.qmth.examcloud.service.core.api;
 import io.swagger.annotations.ApiOperation;
 
 import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 import javax.servlet.http.HttpServletRequest;
 
@@ -44,8 +46,7 @@ public class CoursePropertyController extends ControllerSupport{
 	@GetMapping(value="/courseProperty/all")
 	public ResponseEntity<Object> findAllByOrg(HttpServletRequest request){
 		User user = getAccessUser();
-		//AccessUser accessUser = (AccessUser)request.getAttribute("accessUser");
-		if(user == null){
+		if(user != null){
 			List<CourseProperty> courseProperties = coursePropertyService.findAllByOrgId(user.getRootOrgId());
 			//List<CourseProperty> courseProperties = coursePropertyService.findAllByOrgId(109L);
 			return new ResponseEntity<Object>(courseProperties,HttpStatus.OK);
@@ -59,10 +60,9 @@ public class CoursePropertyController extends ControllerSupport{
 												 @PathVariable Integer curPage,
 												 @PathVariable Integer pageSize,
 												 HttpServletRequest request){
-		 //AccessUser accessUser = (AccessUser) request.getAttribute("accessUser");
 		 User user = getAccessUser();
 		 if(user == null){
-			 return new ResponseEntity(HttpStatus.NOT_FOUND);
+			 return new ResponseEntity<Object>(HttpStatus.NOT_FOUND);
 		 }
 		 coursePropertyDto.setOrgId(user.getRootOrgId());
 		 Page<CourseProperty> coursePropertiesPage = coursePropertyService.findAllByOrg(coursePropertyDto, new PageRequest(curPage - 1,pageSize,new Sort(Direction.DESC, "id")));
@@ -72,7 +72,6 @@ public class CoursePropertyController extends ControllerSupport{
 	@ApiOperation(value="新增课程属性" ,notes="新增课程属性")
 	@PostMapping(value="/courseProperty/save")
 	public ResponseEntity<Object> saveCourseProperty(HttpServletRequest request,@RequestBody CoursePropertyDto coursePropertyDto){
-		//AccessUser accessUser = (AccessUser)request.getAttribute("accessUser");
 		User user = getAccessUser();
 		if(user != null){
 			try {
@@ -89,10 +88,21 @@ public class CoursePropertyController extends ControllerSupport{
 	@ApiOperation(value="启用", notes="启用")
 	@PutMapping(value="/courseProperty/open/{id}")
 	public ResponseEntity<Object> openCourseProperty(HttpServletRequest request, @PathVariable Long id){
-		//AccessUser accessUser = (AccessUser) request.getAttribute("accessUser");
 		User user = getAccessUser();
 		if(user != null){
-			coursePropertyService.openCourseProperty(id, user.getRootOrgId());
+			coursePropertyService.openCourseProperty(id);
+			return new ResponseEntity<Object>(HttpStatus.OK);
+		}
+		return new ResponseEntity<Object>(HttpStatus.NOT_FOUND);
+	}
+	
+	@ApiOperation(value="批量启用", notes="启用")
+	@PutMapping(value="/courseProperty/opens/{ids}")
+	public ResponseEntity<Object> opensCourseProperty(HttpServletRequest request, @PathVariable String ids){
+		User user = getAccessUser();
+		if(user != null){
+			List<String> idList = Stream.of(ids.split(",")).collect(Collectors.toList());
+			coursePropertyService.opensCourseProperty(idList);
 			return new ResponseEntity<Object>(HttpStatus.OK);
 		}
 		return new ResponseEntity<Object>(HttpStatus.NOT_FOUND);
@@ -101,10 +111,21 @@ public class CoursePropertyController extends ControllerSupport{
 	@ApiOperation(value="禁用", notes="禁用")
 	@PutMapping(value="/courseProperty/close/{id}")
 	public ResponseEntity<Object> closeCourseProperty(HttpServletRequest request, @PathVariable Long id){
-		//AccessUser accessUser = (AccessUser) request.getAttribute("accessUser");
 		User user = getAccessUser();
 		if(user != null){
-			coursePropertyService.closeCourseProperty(id, user.getRootOrgId());
+			coursePropertyService.closeCourseProperty(id);
+			return new ResponseEntity<Object>(HttpStatus.OK);
+		}
+		return new ResponseEntity<Object>(HttpStatus.NOT_FOUND);
+	}
+	
+	@ApiOperation(value="批量禁用", notes="禁用")
+	@PutMapping(value="/courseProperty/closes/{ids}")
+	public ResponseEntity<Object> closesCourseProperty(HttpServletRequest request, @PathVariable String ids){
+		User user = getAccessUser();
+		if(user != null){
+			List<String> idList = Stream.of(ids.split(",")).collect(Collectors.toList());
+			coursePropertyService.closesCourseProperty(idList);
 			return new ResponseEntity<Object>(HttpStatus.OK);
 		}
 		return new ResponseEntity<Object>(HttpStatus.NOT_FOUND);
@@ -126,7 +147,6 @@ public class CoursePropertyController extends ControllerSupport{
 	@GetMapping(value="/courseProperty/code/{courseCode}")
 	public ResponseEntity<Object> findAllByCourseCode(HttpServletRequest request,@PathVariable String courseCode){
 		User user = getAccessUser();
-		//AccessUser accessUser = (AccessUser) request.getAttribute("accessUser");
 		if(user != null){
 			List<CourseProperty> courseProperties = coursePropertyService.findAllByCourseCode(courseCode);
 			return new ResponseEntity<Object>(courseProperties,HttpStatus.OK);
@@ -138,7 +158,6 @@ public class CoursePropertyController extends ControllerSupport{
 	@GetMapping(value="/courseProperty/enable/{courseCode}")
 	public ResponseEntity<Object> findAllEnable(HttpServletRequest request,@PathVariable String courseCode){
 		User user = getAccessUser();
-		//AccessUser accessUser = (AccessUser) request.getAttribute("accessUser");
 		if(user != null){
 			List<CourseProperty> courseProperties = coursePropertyService.findAllEnable(courseCode,true);
 			return new ResponseEntity<Object>(courseProperties,HttpStatus.OK);

+ 14 - 0
examcloud-core-questions-api-provider/src/main/java/cn/com/qmth/examcloud/service/core/api/ExportPaperController.java

@@ -5,6 +5,7 @@ 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 io.swagger.annotations.ApiOperation;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -15,6 +16,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+
 import java.io.IOException;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -104,4 +106,16 @@ public class ExportPaperController {
             e.printStackTrace();
         }
     }
+    
+    @ApiOperation(value="导出原始导入的试卷", notes="导出原始导入的试卷")
+    @GetMapping(value = "/originalPaper/export/{paperId}/{loginName}")
+    public void downOriginalPaper(HttpServletResponse response, @PathVariable String paperId, @PathVariable String loginName){
+    	try {
+			exportPaperService.downOriginalPaper(paperId, loginName, response);
+		} catch (Exception e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+    	log.info("开始导出原始导入的试卷");
+    }
 }

+ 0 - 17
examcloud-core-questions-api-provider/src/main/java/cn/com/qmth/examcloud/service/core/api/PaperController.java

@@ -50,7 +50,6 @@ 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.commons.base.exception.StatusException;
 import cn.com.qmth.examcloud.commons.web.security.bean.User;
-import cn.com.qmth.examcloud.commons.web.security.enums.RoleMeta;
 import cn.com.qmth.examcloud.commons.web.support.ControllerSupport;
 import io.swagger.annotations.ApiOperation;
 
@@ -98,7 +97,6 @@ public class PaperController extends ControllerSupport{
     @ApiOperation(value = "保存试卷", notes = "保存试卷")
     @PutMapping(value = "/paper")
     public ResponseEntity savePaperById(HttpServletRequest request, @RequestBody PaperExp paper) {
-        //AccessUser user = (AccessUser) request.getAttribute("accessUser");
         User user = getAccessUser();
         Map<String, Object> msgMap = paperService.savePaper(paper, user);
         if ("success".equals(msgMap.get("msg"))) {
@@ -124,7 +122,6 @@ public class PaperController extends ControllerSupport{
                                           @PathVariable int curPage,
                                           @PathVariable int pageSize) {
     	User user = getAccessUser();
-        //AccessUser user = (AccessUser) request.getAttribute("accessUser");
         paperSearchInfo.setOrgId(user.getRootOrgId().toString());
         return new ResponseEntity(paperService.getImportPapers(paperSearchInfo, curPage, pageSize), HttpStatus.OK);
     }
@@ -134,7 +131,6 @@ public class PaperController extends ControllerSupport{
     public ResponseEntity getImportPapersNotSuccess(HttpServletRequest request,
             @ModelAttribute PaperSearchInfo paperSearchInfo, @PathVariable int curPage, @PathVariable int pageSize) {
     	User user = getAccessUser();
-    	//AccessUser user = (AccessUser) request.getAttribute("accessUser");
         paperSearchInfo.setOrgId(user.getRootOrgId().toString());
         return new ResponseEntity(paperService.getImportPapersNotSuccess(paperSearchInfo, curPage, pageSize),
                 HttpStatus.OK);
@@ -145,7 +141,6 @@ public class PaperController extends ControllerSupport{
     public ResponseEntity<List<Paper>> getImportPapersBySearch(HttpServletRequest request,
                                                                @ModelAttribute PaperSearchInfo paperSearchInfo) {
     	User user = getAccessUser();
-    	//AccessUser user = (AccessUser) request.getAttribute("accessUser");
         paperSearchInfo.setOrgId(user.getRootOrgId().toString());
         return new ResponseEntity<List<Paper>>(paperService.getImportPapersBySearch(paperSearchInfo), HttpStatus.OK);
     }
@@ -155,7 +150,6 @@ public class PaperController extends ControllerSupport{
     public ResponseEntity<List<Paper>> getGenPapersBySearch(HttpServletRequest request,
                                                             @ModelAttribute PaperSearchInfo paperSearchInfo) {
     	User user = getAccessUser();
-    	//AccessUser user = (AccessUser) request.getAttribute("accessUser");
         paperSearchInfo.setOrgId(user.getRootOrgId().toString());
         return new ResponseEntity<List<Paper>>(paperService.getGenPapersBySearch(paperSearchInfo), HttpStatus.OK);
     }
@@ -173,7 +167,6 @@ public class PaperController extends ControllerSupport{
     public ResponseEntity getGenPapers(HttpServletRequest request, @ModelAttribute PaperSearchInfo paperSearchInfo,
             @PathVariable int curPage, @PathVariable int pageSize) {
     	User user = getAccessUser();
-    	//AccessUser user = (AccessUser) request.getAttribute("accessUser");
         paperSearchInfo.setOrgId(user.getRootOrgId().toString());
         return new ResponseEntity(paperService.getGenPapers(paperSearchInfo, curPage, pageSize), HttpStatus.OK);
     }
@@ -192,7 +185,6 @@ public class PaperController extends ControllerSupport{
     public ResponseEntity<Object> getGenPapersNotInIds(HttpServletRequest request, @ModelAttribute PaperSearchInfo paperSearchInfo, 
     		@PathVariable String[] ids, @PathVariable int curPage, @PathVariable int pageSize) {
     	User user = getAccessUser();
-    	//AccessUser user = (AccessUser) request.getAttribute("accessUser");
         paperSearchInfo.setOrgId(user.getRootOrgId().toString());
         if (ids != null && ids.length > 0) {
             return new ResponseEntity<Object>(paperService.getPapersNotInIds(paperSearchInfo, ids, curPage, pageSize,PaperType.GENERATE),
@@ -367,7 +359,6 @@ public class PaperController extends ControllerSupport{
     public ResponseEntity<Object> insertQuestionToPaper(HttpServletRequest request, @PathVariable String paperId,
             @PathVariable String paperDetailId, @RequestBody Question question) {
     	User user = getAccessUser();
-        //AccessUser user = (AccessUser) request.getAttribute("accessUser");
         return new ResponseEntity<Object>(paperService.insertQuestionToPaper(paperId, paperDetailId, question, user),
                 HttpStatus.OK);
 
@@ -470,7 +461,6 @@ public class PaperController extends ControllerSupport{
                                                 @RequestParam(name = "quesType") String quesType,
                                                 @RequestParam(name = "quesBody") String quesBody) {
     	User user = getAccessUser();
-        //AccessUser accessUser = (AccessUser) request.getAttribute("accessUser");
         if(user == null){
             return new ResponseEntity<Object>(new PageImpl<Question>(new ArrayList<Question>()),HttpStatus.OK);
         }
@@ -495,7 +485,6 @@ public class PaperController extends ControllerSupport{
     public ResponseEntity selectQuestionsToPaper(HttpServletRequest request, @PathVariable String paperId,
             @PathVariable String paperDetailId, @RequestBody List<Question> questions) {
     	User user = getAccessUser();
-        //AccessUser user = (AccessUser) request.getAttribute("accessUser");
         return new ResponseEntity(paperService.selectQuestionsToPaper(paperId, paperDetailId, questions, user),
                 HttpStatus.OK);
 
@@ -516,7 +505,6 @@ public class PaperController extends ControllerSupport{
             @ModelAttribute PaperSearchInfo paperSearchInfo, @PathVariable String[] ids, @PathVariable int curPage,
             @PathVariable int pageSize) {
     	User user = getAccessUser();
-        //AccessUser user = (AccessUser) request.getAttribute("accessUser");
         paperSearchInfo.setOrgId(user.getRootOrgId().toString());
         if (ids != null && ids.length > 0) {
             return new ResponseEntity(paperService.getPapersNotInIds(paperSearchInfo, ids, curPage, pageSize,PaperType.IMPORT),
@@ -537,7 +525,6 @@ public class PaperController extends ControllerSupport{
     public ResponseEntity getImportPapersByCourseNo(HttpServletRequest request,
             @ModelAttribute PaperSearchInfo paperSearchInfo) {
     	User user = getAccessUser();
-        //AccessUser user = (AccessUser) request.getAttribute("accessUser");
         paperSearchInfo.setOrgId(user.getRootOrgId().toString());
         paperService.formatPaperSearchInfo(paperSearchInfo);
         Paper importPaper = BeanCopierUtil.copyProperties(paperSearchInfo, Paper.class);
@@ -555,7 +542,6 @@ public class PaperController extends ControllerSupport{
     @PutMapping(value = "/useBasePaper/{paperIds}")
     public ResponseEntity useBasePaper(HttpServletRequest request,@PathVariable String paperIds){
     	User user = getAccessUser();
-    	//AccessUser user = (AccessUser) request.getAttribute("accessUser");
     	try{
     		String[] paperIdArray = paperIds.split(",");
         	for(int i = 0;i<paperIdArray.length;i++){
@@ -590,7 +576,6 @@ public class PaperController extends ControllerSupport{
     @PostMapping(value="/uploadRadio/{paperId}")
     public ResponseEntity uploadRadio(List<MultipartFile> files,@PathVariable String paperId,HttpServletRequest request){
     	User user = getAccessUser();
-    	//AccessUser user = (AccessUser) request.getAttribute("accessUser");
     	try {
 			paperService.uploadRadio(files, paperId, user);
 			return new ResponseEntity(HttpStatus.OK);
@@ -624,7 +609,6 @@ public class PaperController extends ControllerSupport{
     										@PathVariable String paperHtmlUrl,
     										@PathVariable String examId){
     	User user = getAccessUser();
-    	//AccessUser user = (AccessUser) request.getAttribute("accessUser");
     	if(user == null){
     		return new ResponseEntity<Object>(HttpStatus.NOT_FOUND);
     	}
@@ -636,7 +620,6 @@ public class PaperController extends ControllerSupport{
     @GetMapping(value="/questionStructure")
     public QuestionAllTypeDto findQuestionStructure(HttpServletRequest request,@RequestParam("paperId") String paperId, @RequestHeader("user_token") String user_token) throws Exception{
     	User user = getAccessUser();
-    	//AccessUser user = (AccessUser) request.getAttribute("accessUser");
 		return paperService.findQuestionStructure(paperId,user);
     }
 }

+ 1425 - 0
examcloud-core-questions-base/src/main/resources/original_paper.ftl

@@ -0,0 +1,1425 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<?mso-application progid="Word.Document"?>
+<pkg:package xmlns:pkg="http://schemas.microsoft.com/office/2006/xmlPackage">
+	<pkg:part pkg:contentType="application/vnd.openxmlformats-package.relationships+xml" pkg:name="/_rels/.rels" pkg:padding="512">
+		<pkg:xmlData>
+			<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
+				<Relationship Id="rId3" Target="docProps/app.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties"/>
+				<Relationship Id="rId2" Target="docProps/core.xml" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties"/>
+				<Relationship Id="rId1" Target="word/document.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument"/>
+			</Relationships>
+		</pkg:xmlData>
+	</pkg:part>
+	<pkg:part pkg:contentType="application/vnd.openxmlformats-package.relationships+xml" pkg:name="/word/_rels/document.xml.rels" pkg:padding="256">
+		<pkg:xmlData>
+			<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
+				<Relationship Id="rId3" Target="webSettings.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/webSettings"/>
+				<Relationship Id="rId7" Target="theme/theme1.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme"/>
+				<Relationship Id="rId2" Target="settings.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings"/>
+				<Relationship Id="rId1" Target="styles.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles"/>
+				<Relationship Id="rId6" Target="fontTable.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable"/>
+				<Relationship Id="rId5" Target="endnotes.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/endnotes"/>
+				<Relationship Id="rId4" Target="footnotes.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/footnotes"/>
+			</Relationships>
+		</pkg:xmlData>
+	</pkg:part>
+	<pkg:part pkg:contentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml" pkg:name="/word/document.xml">
+		<pkg:xmlData>
+			<w:document xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:ve="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing">
+				<w:body>
+					<#if paperDetails?exists>
+	    			<#list paperDetails as paperDetail>
+					<w:p w:rsidP="00F62967" w:rsidR="00F62967" w:rsidRDefault="00F62967" w:rsidRPr="003A4B1C">
+						<w:r w:rsidRPr="003A4B1C">
+							<w:rPr>
+								<w:rFonts w:hint="eastAsia"/>
+							</w:rPr>
+							<w:t>[</w:t>
+						</w:r>
+						<w:r w:rsidRPr="003A4B1C">
+							<w:rPr>
+								<w:rFonts w:hint="eastAsia"/>
+							</w:rPr>
+							<w:t>试题分类</w:t>
+						</w:r>
+						<w:r w:rsidRPr="003A4B1C">
+							<w:rPr>
+								<w:rFonts w:hint="eastAsia"/>
+							</w:rPr>
+							<w:t>]:</w:t>
+						</w:r>
+						<w:r w:rsidRPr="00473411">
+							<w:rPr>
+								<w:rFonts w:hint="eastAsia"/>
+								<w:b/>
+								<w:szCs w:val="21"/>
+							</w:rPr>
+							<w:t xml:space="preserve"/>
+						</w:r>
+						<w:r w:rsidRPr="00F955A6">
+							<w:rPr>
+								<w:rFonts w:hint="eastAsia"/>
+								<w:b/>
+								<w:szCs w:val="21"/>
+							</w:rPr>
+							<w:t>${courseName}</w:t>
+						</w:r>
+						<w:r w:rsidRPr="003A4B1C">
+							<w:rPr>
+								<w:rFonts w:hint="eastAsia"/>
+							</w:rPr>
+							<w:t>_</w:t>
+						</w:r>
+						<w:r w:rsidR="006F4609">
+							<w:rPr>
+								<w:rFonts w:ascii="Arial" w:cs="Arial" w:hAnsi="Arial"/>
+								<w:color w:val="1F2D3D"/>
+								<w:sz w:val="14"/>
+								<w:szCs w:val="14"/>
+								<w:shd w:color="auto" w:fill="FFFFFF" w:val="clear"/>
+							</w:rPr>
+							<w:t>${courseNo}</w:t>
+						</w:r>
+					</w:p>
+					<w:p w:rsidP="00F62967" w:rsidR="00F62967" w:rsidRDefault="00F62967" w:rsidRPr="003A4B1C">
+						<w:r w:rsidRPr="003A4B1C">
+							<w:rPr>
+								<w:rFonts w:hint="eastAsia"/>
+							</w:rPr>
+							<w:t>[</w:t>
+						</w:r>
+						<w:r w:rsidRPr="003A4B1C">
+							<w:rPr>
+								<w:rFonts w:hint="eastAsia"/>
+							</w:rPr>
+							<w:t>题型</w:t>
+						</w:r>
+						<w:r w:rsidRPr="003A4B1C">
+							<w:rPr>
+								<w:rFonts w:hint="eastAsia"/>
+							</w:rPr>
+							<w:t>]:</w:t>
+						</w:r>
+						<w:r>
+							<w:rPr>
+								<w:rFonts w:hint="eastAsia"/>
+							</w:rPr>
+							<w:t>${paperDetail.quesType}</w:t>
+						</w:r>
+					</w:p>
+					<w:p w:rsidP="00F62967" w:rsidR="00F62967" w:rsidRDefault="00F62967" w:rsidRPr="003A4B1C">
+						<w:r w:rsidRPr="003A4B1C">
+							<w:rPr>
+								<w:rFonts w:hint="eastAsia"/>
+							</w:rPr>
+							<w:t>[</w:t>
+						</w:r>
+						<w:r w:rsidRPr="003A4B1C">
+							<w:rPr>
+								<w:rFonts w:hint="eastAsia"/>
+							</w:rPr>
+							<w:t>大题名称</w:t>
+						</w:r>
+						<w:r w:rsidRPr="003A4B1C">
+							<w:rPr>
+								<w:rFonts w:hint="eastAsia"/>
+							</w:rPr>
+							<w:t>]:</w:t>
+						</w:r>
+						<w:r>
+							<w:rPr>
+								<w:rFonts w:hint="eastAsia"/>
+							</w:rPr>
+							<w:t>${paperDetail.name}</w:t>
+						</w:r>
+					</w:p>
+					<w:p w:rsidP="00F62967" w:rsidR="00F62967" w:rsidRDefault="00F62967" w:rsidRPr="003A4B1C">
+						<w:r w:rsidRPr="003A4B1C">
+							<w:rPr>
+								<w:rFonts w:hint="eastAsia"/>
+							</w:rPr>
+							<w:t>[</w:t>
+						</w:r>
+						<w:r w:rsidRPr="003A4B1C">
+							<w:rPr>
+								<w:rFonts w:hint="eastAsia"/>
+							</w:rPr>
+							<w:t>题目数量</w:t>
+						</w:r>
+						<w:r w:rsidRPr="003A4B1C">
+							<w:rPr>
+								<w:rFonts w:hint="eastAsia"/>
+							</w:rPr>
+							<w:t>]:</w:t>
+						</w:r>
+						<w:r>
+							<w:rPr>
+								<w:rFonts w:hint="eastAsia"/>
+							</w:rPr>
+							<w:t>${paperDetail.unitCount}</w:t>
+						</w:r>
+					</w:p>
+					<w:p w:rsidP="00F62967" w:rsidR="00F62967" w:rsidRDefault="00F62967" w:rsidRPr="003A4B1C">
+						<w:r w:rsidRPr="003A4B1C">
+							<w:rPr>
+								<w:rFonts w:hint="eastAsia"/>
+							</w:rPr>
+							<w:t>[</w:t>
+						</w:r>
+						<w:r w:rsidRPr="003A4B1C">
+							<w:rPr>
+								<w:rFonts w:hint="eastAsia"/>
+							</w:rPr>
+							<w:t>分数</w:t>
+						</w:r>
+						<w:r w:rsidRPr="003A4B1C">
+							<w:rPr>
+								<w:rFonts w:hint="eastAsia"/>
+							</w:rPr>
+							<w:t>]:</w:t>
+						</w:r>
+						<w:r>
+							<w:rPr>
+								<w:rFonts w:hint="eastAsia"/>
+							</w:rPr>
+							<w:t>${paperDetail.firstScore}</w:t>
+						</w:r>
+					</w:p>
+					<w:p w:rsidP="00F62967" w:rsidR="00F62967" w:rsidRDefault="00F62967"/>
+						<!--循环小题-->
+		    			<#if paperDetail.paperDetailUnits?exists>
+		    			<#list paperDetail.paperDetailUnits as paperDetailUnit>
+		    				<!--套题-->
+			    			<#if paperDetailUnit.question.subQuestions?exists>
+			    				<w:p w:rsidP="00F62967" w:rsidR="00F62967" w:rsidRDefault="00F62967">
+									<w:r>
+										<w:rPr>
+											<w:rFonts w:hint="eastAsia"/>
+										</w:rPr>
+										<w:t>[</w:t>
+									</w:r>
+									<w:r>
+										<w:rPr>
+											<w:rFonts w:hint="eastAsia"/>
+										</w:rPr>
+										<w:t>套题</w:t>
+									</w:r>
+									<w:r>
+										<w:rPr>
+											<w:rFonts w:hint="eastAsia"/>
+										</w:rPr>
+										<w:t>]:</w:t>
+									</w:r>
+									<w:r>
+										<w:rPr>
+											<w:rFonts w:hint="eastAsia"/>
+										</w:rPr>
+										<w:t>${paperDetailUnit_index+1}</w:t>
+									</w:r>
+								</w:p>
+								<w:p w:rsidP="00F62967" w:rsidR="00F62967" w:rsidRDefault="00F62967">
+									<w:r>
+										<w:rPr>
+											<w:rFonts w:hint="eastAsia"/>
+										</w:rPr>
+										<w:t>[</w:t>
+									</w:r>
+									<w:r>
+										<w:rPr>
+											<w:rFonts w:hint="eastAsia"/>
+										</w:rPr>
+										<w:t>套题数量</w:t>
+									</w:r>
+									<w:r>
+										<w:rPr>
+											<w:rFonts w:hint="eastAsia"/>
+										</w:rPr>
+										<w:t>]:</w:t>
+									</w:r>
+									<w:r>
+										<w:rPr>
+											<w:rFonts w:hint="eastAsia"/>
+										</w:rPr>
+										<w:t>${paperDetailUnit.question.subQuestions?size}</w:t>
+									</w:r>
+								</w:p>
+								${paperDetailUnit.question.quesBodyWord}
+				    			<#list paperDetailUnit.question.subQuestions as subQuestion>
+				    				<w:p w:rsidP="00F62967" w:rsidR="00F62967" w:rsidRDefault="00F62967">
+										<w:r>
+											<w:rPr>
+												<w:rFonts w:hint="eastAsia"/>
+											</w:rPr>
+											<w:t>[</w:t>
+										</w:r>
+										<w:r>
+											<w:rPr>
+												<w:rFonts w:hint="eastAsia"/>
+											</w:rPr>
+											<w:t>小题型</w:t>
+										</w:r>
+										<w:r>
+											<w:rPr>
+												<w:rFonts w:hint="eastAsia"/>
+											</w:rPr>
+											<w:t>]:</w:t>
+										</w:r>
+										<w:r>
+											<w:rPr>
+												<w:rFonts w:hint="eastAsia"/>
+											</w:rPr>
+											<w:t>${subQuestion.questionType}</w:t>
+										</w:r>
+									</w:p>
+				    				${subQuestion.quesBodyWord}
+				    				<#if subQuestion.quesOptions?exists>
+				    				<#list subQuestion.quesOptions as subQuesOption>
+				    					${subQuesOption.optionBodyWord}
+				    				</#list>
+				    				</#if>
+				    				${subQuestion.quesAnswerWord!}
+				    				<w:p w:rsidP="00F62967" w:rsidR="00F62967" w:rsidRDefault="00F62967">
+									<w:r>
+										<w:rPr>
+											<w:rFonts w:hint="eastAsia"/>
+										</w:rPr>
+										<w:t>[</w:t>
+									</w:r>
+									<w:r>
+										<w:rPr>
+											<w:rFonts w:hint="eastAsia"/>
+										</w:rPr>
+										<w:t>难度</w:t>
+									</w:r>
+									<w:r w:rsidR="00F35998">
+										<w:rPr>
+											<w:rFonts w:hint="eastAsia"/>
+										</w:rPr>
+										<w:t>]:</w:t>
+									</w:r>
+									<w:r>
+										<w:rPr>
+											<w:rFonts w:hint="eastAsia"/>
+										</w:rPr>
+										<w:t>${subQuestion.difficultyDegree!}</w:t>
+									</w:r>
+								</w:p>
+								<w:p w:rsidP="00F62967" w:rsidR="00F62967" w:rsidRDefault="00F62967">
+									<w:r>
+										<w:rPr>
+											<w:rFonts w:hint="eastAsia"/>
+										</w:rPr>
+										<w:t>[</w:t>
+									</w:r>
+									<w:r>
+										<w:rPr>
+											<w:rFonts w:hint="eastAsia"/>
+										</w:rPr>
+										<w:t>一级属性</w:t>
+									</w:r>
+									<w:r w:rsidR="008978E3">
+										<w:rPr>
+											<w:rFonts w:hint="eastAsia"/>
+										</w:rPr>
+										<w:t>]:</w:t>
+									</w:r>
+									<#if subQuestion.quesProperties?? && (subQuestion.quesProperties?size > 0)>
+										<w:r w:rsidR="00FC0BCE">
+											<w:rPr>
+												<w:rFonts w:hint="eastAsia"/>
+											</w:rPr>
+											<w:t>${subQuestion.quesProperties[0].firstProperty.name}</w:t>
+										</w:r>
+									</#if>
+								</w:p>
+								<w:p w:rsidP="00F62967" w:rsidR="00F62967" w:rsidRDefault="00F62967">
+									<w:r>
+										<w:rPr>
+											<w:rFonts w:hint="eastAsia"/>
+										</w:rPr>
+										<w:t>[</w:t>
+									</w:r>
+									<w:r>
+										<w:rPr>
+											<w:rFonts w:hint="eastAsia"/>
+										</w:rPr>
+										<w:t>二级属性</w:t>
+									</w:r>
+									<w:r>
+										<w:rPr>
+											<w:rFonts w:hint="eastAsia"/>
+										</w:rPr>
+										<w:t>]:</w:t>
+									</w:r>
+									<#if subQuestion.quesProperties?? && (subQuestion.quesProperties?size > 0)>
+										<#if subQuestion.quesProperties[0].secondProperty??>
+										<w:r w:rsidR="00FC0BCE">
+											<w:rPr>
+												<w:rFonts w:hint="eastAsia"/>
+											</w:rPr>
+											<w:t>${subQuestion.quesProperties[0].secondProperty.name}</w:t>
+										</w:r>
+										</#if>
+									</#if>
+								</w:p>
+								<w:p w:rsidP="00F62967" w:rsidR="00F62967" w:rsidRDefault="00F62967">
+									<w:r>
+										<w:rPr>
+											<w:rFonts w:hint="eastAsia"/>
+										</w:rPr>
+										<w:t>[</w:t>
+									</w:r>
+									<w:r>
+										<w:rPr>
+											<w:rFonts w:hint="eastAsia"/>
+										</w:rPr>
+										<w:t>公开度</w:t>
+									</w:r>
+									<w:r>
+										<w:rPr>
+											<w:rFonts w:hint="eastAsia"/>
+										</w:rPr>
+										<w:t>]:</w:t>
+									</w:r>
+									<#if subQuestion.publicity??>
+										<#if subQuestion.publicity>
+										<w:r w:rsidR="004A272D">
+											<w:rPr>
+												<w:rFonts w:hint="eastAsia"/>
+											</w:rPr>
+											<w:t>公开</w:t>
+										</w:r>
+										<#else>
+										<w:r w:rsidR="004A272D">
+											<w:rPr>
+												<w:rFonts w:hint="eastAsia"/>
+											</w:rPr>
+											<w:t>非公开</w:t>
+										</w:r>
+										</#if>
+									</#if>
+								</w:p>
+								<w:p w:rsidP="00F62967" w:rsidR="00F62967" w:rsidRDefault="00F62967">
+									<w:r>
+										<w:rPr>
+											<w:rFonts w:hint="eastAsia"/>
+										</w:rPr>
+										<w:t>[</w:t>
+									</w:r>
+									<w:r>
+										<w:rPr>
+											<w:rFonts w:hint="eastAsia"/>
+										</w:rPr>
+										<w:t>小题分数</w:t>
+									</w:r>
+									<w:r>
+										<w:rPr>
+											<w:rFonts w:hint="eastAsia"/>
+										</w:rPr>
+										<w:t>]:</w:t>
+									</w:r>
+									<w:r w:rsidR="004A272D">
+										<w:rPr>
+											<w:rFonts w:hint="eastAsia"/>
+										</w:rPr>
+										<w:t>${subQuestion.score}</w:t>
+									</w:r>
+								</w:p>
+								<w:p w:rsidR="008C75CD" w:rsidRDefault="008C75CD"/>
+				    			</#list>
+			    			<#else>
+			    				${paperDetailUnit.question.quesBodyWord}
+			    				<!--选项-->
+		    					<#if paperDetailUnit.question.quesOptions?exists>
+		    					<#list paperDetailUnit.question.quesOptions as quesOption>
+		    						${quesOption.optionBodyWord}
+		    					</#list>
+		    					</#if>
+		    					${paperDetailUnit.question.quesAnswerWord!}
+		    					<w:p w:rsidP="00F62967" w:rsidR="00F62967" w:rsidRDefault="00F62967">
+									<w:r>
+										<w:rPr>
+											<w:rFonts w:hint="eastAsia"/>
+										</w:rPr>
+										<w:t>[</w:t>
+									</w:r>
+									<w:r>
+										<w:rPr>
+											<w:rFonts w:hint="eastAsia"/>
+										</w:rPr>
+										<w:t>难度</w:t>
+									</w:r>
+									<w:r w:rsidR="00F35998">
+										<w:rPr>
+											<w:rFonts w:hint="eastAsia"/>
+										</w:rPr>
+										<w:t>]:</w:t>
+									</w:r>
+									<w:r>
+										<w:rPr>
+											<w:rFonts w:hint="eastAsia"/>
+										</w:rPr>
+										<w:t>${paperDetailUnit.question.difficultyDegree!}</w:t>
+									</w:r>
+								</w:p>
+								<w:p w:rsidP="00F62967" w:rsidR="00F62967" w:rsidRDefault="00F62967">
+									<w:r>
+										<w:rPr>
+											<w:rFonts w:hint="eastAsia"/>
+										</w:rPr>
+										<w:t>[</w:t>
+									</w:r>
+									<w:r>
+										<w:rPr>
+											<w:rFonts w:hint="eastAsia"/>
+										</w:rPr>
+										<w:t>一级属性</w:t>
+									</w:r>
+									<w:r w:rsidR="008978E3">
+										<w:rPr>
+											<w:rFonts w:hint="eastAsia"/>
+										</w:rPr>
+										<w:t>]:</w:t>
+									</w:r>
+									<w:r w:rsidR="00FC0BCE">
+										<w:rPr>
+											<w:rFonts w:hint="eastAsia"/>
+										</w:rPr>
+										<w:t>${paperDetailUnit.firstName!}</w:t>
+									</w:r>
+								</w:p>
+								<w:p w:rsidP="00F62967" w:rsidR="00F62967" w:rsidRDefault="00F62967">
+									<w:r>
+										<w:rPr>
+											<w:rFonts w:hint="eastAsia"/>
+										</w:rPr>
+										<w:t>[</w:t>
+									</w:r>
+									<w:r>
+										<w:rPr>
+											<w:rFonts w:hint="eastAsia"/>
+										</w:rPr>
+										<w:t>二级属性</w:t>
+									</w:r>
+									<w:r>
+										<w:rPr>
+											<w:rFonts w:hint="eastAsia"/>
+										</w:rPr>
+										<w:t>]:</w:t>
+									</w:r>
+									<w:r w:rsidR="00FC0BCE">
+										<w:rPr>
+											<w:rFonts w:hint="eastAsia"/>
+										</w:rPr>
+										<w:t>${paperDetailUnit.secondName!}</w:t>
+									</w:r>
+								</w:p>
+								<w:p w:rsidP="00F62967" w:rsidR="00F62967" w:rsidRDefault="00F62967">
+									<w:r>
+										<w:rPr>
+											<w:rFonts w:hint="eastAsia"/>
+										</w:rPr>
+										<w:t>[</w:t>
+									</w:r>
+									<w:r>
+										<w:rPr>
+											<w:rFonts w:hint="eastAsia"/>
+										</w:rPr>
+										<w:t>公开度</w:t>
+									</w:r>
+									<w:r>
+										<w:rPr>
+											<w:rFonts w:hint="eastAsia"/>
+										</w:rPr>
+										<w:t>]:</w:t>
+									</w:r>
+									<w:r w:rsidR="004A272D">
+										<w:rPr>
+											<w:rFonts w:hint="eastAsia"/>
+										</w:rPr>
+										<w:t>${paperDetailUnit.publicity}</w:t>
+									</w:r>
+								</w:p>
+								<w:p w:rsidP="00F62967" w:rsidR="00F62967" w:rsidRDefault="00F62967">
+									<w:r>
+										<w:rPr>
+											<w:rFonts w:hint="eastAsia"/>
+										</w:rPr>
+										<w:t>[</w:t>
+									</w:r>
+									<w:r>
+										<w:rPr>
+											<w:rFonts w:hint="eastAsia"/>
+										</w:rPr>
+										<w:t>小题分数</w:t>
+									</w:r>
+									<w:r>
+										<w:rPr>
+											<w:rFonts w:hint="eastAsia"/>
+										</w:rPr>
+										<w:t>]:</w:t>
+									</w:r>
+									<w:r w:rsidR="004A272D">
+										<w:rPr>
+											<w:rFonts w:hint="eastAsia"/>
+										</w:rPr>
+										<w:t>${paperDetailUnit.score}</w:t>
+									</w:r>
+								</w:p>
+								<w:p w:rsidR="008C75CD" w:rsidRDefault="008C75CD"/>
+			    			</#if>
+						</#list>
+		    			</#if>
+	    			</#list>
+	    			</#if>
+					<w:p w:rsidR="008C75CD" w:rsidRDefault="008C75CD"/>
+					<w:sectPr w:rsidR="008C75CD" w:rsidSect="001205CF">
+						<w:pgSz w:h="16838" w:w="11906"/>
+						<w:pgMar w:bottom="1440" w:footer="992" w:gutter="0" w:header="851" w:left="1800" w:right="1800" w:top="1440"/>
+						<w:cols w:space="425"/>
+						<w:docGrid w:linePitch="312" w:type="lines"/>
+					</w:sectPr>
+				</w:body>
+			</w:document>
+		</pkg:xmlData>
+	</pkg:part>
+	<pkg:part pkg:contentType="application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml" pkg:name="/word/footnotes.xml">
+		<pkg:xmlData>
+			<w:footnotes xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:ve="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing">
+				<w:footnote w:id="-1" w:type="separator">
+					<w:p w:rsidP="0087455D" w:rsidR="00D21F17" w:rsidRDefault="00D21F17">
+						<w:r>
+							<w:separator/>
+						</w:r>
+					</w:p>
+				</w:footnote>
+				<w:footnote w:id="0" w:type="continuationSeparator">
+					<w:p w:rsidP="0087455D" w:rsidR="00D21F17" w:rsidRDefault="00D21F17">
+						<w:r>
+							<w:continuationSeparator/>
+						</w:r>
+					</w:p>
+				</w:footnote>
+			</w:footnotes>
+		</pkg:xmlData>
+	</pkg:part>
+	<pkg:part pkg:contentType="application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml" pkg:name="/word/endnotes.xml">
+		<pkg:xmlData>
+			<w:endnotes xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:ve="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing">
+				<w:endnote w:id="-1" w:type="separator">
+					<w:p w:rsidP="0087455D" w:rsidR="00D21F17" w:rsidRDefault="00D21F17">
+						<w:r>
+							<w:separator/>
+						</w:r>
+					</w:p>
+				</w:endnote>
+				<w:endnote w:id="0" w:type="continuationSeparator">
+					<w:p w:rsidP="0087455D" w:rsidR="00D21F17" w:rsidRDefault="00D21F17">
+						<w:r>
+							<w:continuationSeparator/>
+						</w:r>
+					</w:p>
+				</w:endnote>
+			</w:endnotes>
+		</pkg:xmlData>
+	</pkg:part>
+	<pkg:part pkg:contentType="application/vnd.openxmlformats-officedocument.theme+xml" pkg:name="/word/theme/theme1.xml">
+		<pkg:xmlData>
+			<a:theme name="Office 主题" xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">
+				<a:themeElements>
+					<a:clrScheme name="Office">
+						<a:dk1>
+							<a:sysClr lastClr="000000" val="windowText"/>
+						</a:dk1>
+						<a:lt1>
+							<a:sysClr lastClr="FFFFFF" val="window"/>
+						</a:lt1>
+						<a:dk2>
+							<a:srgbClr val="1F497D"/>
+						</a:dk2>
+						<a:lt2>
+							<a:srgbClr val="EEECE1"/>
+						</a:lt2>
+						<a:accent1>
+							<a:srgbClr val="4F81BD"/>
+						</a:accent1>
+						<a:accent2>
+							<a:srgbClr val="C0504D"/>
+						</a:accent2>
+						<a:accent3>
+							<a:srgbClr val="9BBB59"/>
+						</a:accent3>
+						<a:accent4>
+							<a:srgbClr val="8064A2"/>
+						</a:accent4>
+						<a:accent5>
+							<a:srgbClr val="4BACC6"/>
+						</a:accent5>
+						<a:accent6>
+							<a:srgbClr val="F79646"/>
+						</a:accent6>
+						<a:hlink>
+							<a:srgbClr val="0000FF"/>
+						</a:hlink>
+						<a:folHlink>
+							<a:srgbClr val="800080"/>
+						</a:folHlink>
+					</a:clrScheme>
+					<a:fontScheme name="Office">
+						<a:majorFont>
+							<a:latin typeface="Cambria"/>
+							<a:ea typeface=""/>
+							<a:cs typeface=""/>
+							<a:font script="Jpan" typeface="MS ゴシック"/>
+							<a:font script="Hang" typeface="맑은 고딕"/>
+							<a:font script="Hans" typeface="宋体"/>
+							<a:font script="Hant" typeface="新細明體"/>
+							<a:font script="Arab" typeface="Times New Roman"/>
+							<a:font script="Hebr" typeface="Times New Roman"/>
+							<a:font script="Thai" typeface="Angsana New"/>
+							<a:font script="Ethi" typeface="Nyala"/>
+							<a:font script="Beng" typeface="Vrinda"/>
+							<a:font script="Gujr" typeface="Shruti"/>
+							<a:font script="Khmr" typeface="MoolBoran"/>
+							<a:font script="Knda" typeface="Tunga"/>
+							<a:font script="Guru" typeface="Raavi"/>
+							<a:font script="Cans" typeface="Euphemia"/>
+							<a:font script="Cher" typeface="Plantagenet Cherokee"/>
+							<a:font script="Yiii" typeface="Microsoft Yi Baiti"/>
+							<a:font script="Tibt" typeface="Microsoft Himalaya"/>
+							<a:font script="Thaa" typeface="MV Boli"/>
+							<a:font script="Deva" typeface="Mangal"/>
+							<a:font script="Telu" typeface="Gautami"/>
+							<a:font script="Taml" typeface="Latha"/>
+							<a:font script="Syrc" typeface="Estrangelo Edessa"/>
+							<a:font script="Orya" typeface="Kalinga"/>
+							<a:font script="Mlym" typeface="Kartika"/>
+							<a:font script="Laoo" typeface="DokChampa"/>
+							<a:font script="Sinh" typeface="Iskoola Pota"/>
+							<a:font script="Mong" typeface="Mongolian Baiti"/>
+							<a:font script="Viet" typeface="Times New Roman"/>
+							<a:font script="Uigh" typeface="Microsoft Uighur"/>
+						</a:majorFont>
+						<a:minorFont>
+							<a:latin typeface="Calibri"/>
+							<a:ea typeface=""/>
+							<a:cs typeface=""/>
+							<a:font script="Jpan" typeface="MS 明朝"/>
+							<a:font script="Hang" typeface="맑은 고딕"/>
+							<a:font script="Hans" typeface="宋体"/>
+							<a:font script="Hant" typeface="新細明體"/>
+							<a:font script="Arab" typeface="Arial"/>
+							<a:font script="Hebr" typeface="Arial"/>
+							<a:font script="Thai" typeface="Cordia New"/>
+							<a:font script="Ethi" typeface="Nyala"/>
+							<a:font script="Beng" typeface="Vrinda"/>
+							<a:font script="Gujr" typeface="Shruti"/>
+							<a:font script="Khmr" typeface="DaunPenh"/>
+							<a:font script="Knda" typeface="Tunga"/>
+							<a:font script="Guru" typeface="Raavi"/>
+							<a:font script="Cans" typeface="Euphemia"/>
+							<a:font script="Cher" typeface="Plantagenet Cherokee"/>
+							<a:font script="Yiii" typeface="Microsoft Yi Baiti"/>
+							<a:font script="Tibt" typeface="Microsoft Himalaya"/>
+							<a:font script="Thaa" typeface="MV Boli"/>
+							<a:font script="Deva" typeface="Mangal"/>
+							<a:font script="Telu" typeface="Gautami"/>
+							<a:font script="Taml" typeface="Latha"/>
+							<a:font script="Syrc" typeface="Estrangelo Edessa"/>
+							<a:font script="Orya" typeface="Kalinga"/>
+							<a:font script="Mlym" typeface="Kartika"/>
+							<a:font script="Laoo" typeface="DokChampa"/>
+							<a:font script="Sinh" typeface="Iskoola Pota"/>
+							<a:font script="Mong" typeface="Mongolian Baiti"/>
+							<a:font script="Viet" typeface="Arial"/>
+							<a:font script="Uigh" typeface="Microsoft Uighur"/>
+						</a:minorFont>
+					</a:fontScheme>
+					<a:fmtScheme name="Office">
+						<a:fillStyleLst>
+							<a:solidFill>
+								<a:schemeClr val="phClr"/>
+							</a:solidFill>
+							<a:gradFill rotWithShape="1">
+								<a:gsLst>
+									<a:gs pos="0">
+										<a:schemeClr val="phClr">
+											<a:tint val="50000"/>
+											<a:satMod val="300000"/>
+										</a:schemeClr>
+									</a:gs>
+									<a:gs pos="35000">
+										<a:schemeClr val="phClr">
+											<a:tint val="37000"/>
+											<a:satMod val="300000"/>
+										</a:schemeClr>
+									</a:gs>
+									<a:gs pos="100000">
+										<a:schemeClr val="phClr">
+											<a:tint val="15000"/>
+											<a:satMod val="350000"/>
+										</a:schemeClr>
+									</a:gs>
+								</a:gsLst>
+								<a:lin ang="16200000" scaled="1"/>
+							</a:gradFill>
+							<a:gradFill rotWithShape="1">
+								<a:gsLst>
+									<a:gs pos="0">
+										<a:schemeClr val="phClr">
+											<a:shade val="51000"/>
+											<a:satMod val="130000"/>
+										</a:schemeClr>
+									</a:gs>
+									<a:gs pos="80000">
+										<a:schemeClr val="phClr">
+											<a:shade val="93000"/>
+											<a:satMod val="130000"/>
+										</a:schemeClr>
+									</a:gs>
+									<a:gs pos="100000">
+										<a:schemeClr val="phClr">
+											<a:shade val="94000"/>
+											<a:satMod val="135000"/>
+										</a:schemeClr>
+									</a:gs>
+								</a:gsLst>
+								<a:lin ang="16200000" scaled="0"/>
+							</a:gradFill>
+						</a:fillStyleLst>
+						<a:lnStyleLst>
+							<a:ln algn="ctr" cap="flat" cmpd="sng" w="9525">
+								<a:solidFill>
+									<a:schemeClr val="phClr">
+										<a:shade val="95000"/>
+										<a:satMod val="105000"/>
+									</a:schemeClr>
+								</a:solidFill>
+								<a:prstDash val="solid"/>
+							</a:ln>
+							<a:ln algn="ctr" cap="flat" cmpd="sng" w="25400">
+								<a:solidFill>
+									<a:schemeClr val="phClr"/>
+								</a:solidFill>
+								<a:prstDash val="solid"/>
+							</a:ln>
+							<a:ln algn="ctr" cap="flat" cmpd="sng" w="38100">
+								<a:solidFill>
+									<a:schemeClr val="phClr"/>
+								</a:solidFill>
+								<a:prstDash val="solid"/>
+							</a:ln>
+						</a:lnStyleLst>
+						<a:effectStyleLst>
+							<a:effectStyle>
+								<a:effectLst>
+									<a:outerShdw blurRad="40000" dir="5400000" dist="20000" rotWithShape="0">
+										<a:srgbClr val="000000">
+											<a:alpha val="38000"/>
+										</a:srgbClr>
+									</a:outerShdw>
+								</a:effectLst>
+							</a:effectStyle>
+							<a:effectStyle>
+								<a:effectLst>
+									<a:outerShdw blurRad="40000" dir="5400000" dist="23000" rotWithShape="0">
+										<a:srgbClr val="000000">
+											<a:alpha val="35000"/>
+										</a:srgbClr>
+									</a:outerShdw>
+								</a:effectLst>
+							</a:effectStyle>
+							<a:effectStyle>
+								<a:effectLst>
+									<a:outerShdw blurRad="40000" dir="5400000" dist="23000" rotWithShape="0">
+										<a:srgbClr val="000000">
+											<a:alpha val="35000"/>
+										</a:srgbClr>
+									</a:outerShdw>
+								</a:effectLst>
+								<a:scene3d>
+									<a:camera prst="orthographicFront">
+										<a:rot lat="0" lon="0" rev="0"/>
+									</a:camera>
+									<a:lightRig dir="t" rig="threePt">
+										<a:rot lat="0" lon="0" rev="1200000"/>
+									</a:lightRig>
+								</a:scene3d>
+								<a:sp3d>
+									<a:bevelT h="25400" w="63500"/>
+								</a:sp3d>
+							</a:effectStyle>
+						</a:effectStyleLst>
+						<a:bgFillStyleLst>
+							<a:solidFill>
+								<a:schemeClr val="phClr"/>
+							</a:solidFill>
+							<a:gradFill rotWithShape="1">
+								<a:gsLst>
+									<a:gs pos="0">
+										<a:schemeClr val="phClr">
+											<a:tint val="40000"/>
+											<a:satMod val="350000"/>
+										</a:schemeClr>
+									</a:gs>
+									<a:gs pos="40000">
+										<a:schemeClr val="phClr">
+											<a:tint val="45000"/>
+											<a:shade val="99000"/>
+											<a:satMod val="350000"/>
+										</a:schemeClr>
+									</a:gs>
+									<a:gs pos="100000">
+										<a:schemeClr val="phClr">
+											<a:shade val="20000"/>
+											<a:satMod val="255000"/>
+										</a:schemeClr>
+									</a:gs>
+								</a:gsLst>
+								<a:path path="circle">
+									<a:fillToRect b="180000" l="50000" r="50000" t="-80000"/>
+								</a:path>
+							</a:gradFill>
+							<a:gradFill rotWithShape="1">
+								<a:gsLst>
+									<a:gs pos="0">
+										<a:schemeClr val="phClr">
+											<a:tint val="80000"/>
+											<a:satMod val="300000"/>
+										</a:schemeClr>
+									</a:gs>
+									<a:gs pos="100000">
+										<a:schemeClr val="phClr">
+											<a:shade val="30000"/>
+											<a:satMod val="200000"/>
+										</a:schemeClr>
+									</a:gs>
+								</a:gsLst>
+								<a:path path="circle">
+									<a:fillToRect b="50000" l="50000" r="50000" t="50000"/>
+								</a:path>
+							</a:gradFill>
+						</a:bgFillStyleLst>
+					</a:fmtScheme>
+				</a:themeElements>
+				<a:objectDefaults/>
+				<a:extraClrSchemeLst/>
+			</a:theme>
+		</pkg:xmlData>
+	</pkg:part>
+	<pkg:part pkg:contentType="application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml" pkg:name="/word/settings.xml">
+		<pkg:xmlData>
+			<w:settings xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:sl="http://schemas.openxmlformats.org/schemaLibrary/2006/main" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w10="urn:schemas-microsoft-com:office:word">
+				<w:zoom w:percent="100"/>
+				<w:bordersDoNotSurroundHeader/>
+				<w:bordersDoNotSurroundFooter/>
+				<w:proofState w:spelling="clean"/>
+				<w:defaultTabStop w:val="420"/>
+				<w:drawingGridVerticalSpacing w:val="156"/>
+				<w:displayHorizontalDrawingGridEvery w:val="0"/>
+				<w:displayVerticalDrawingGridEvery w:val="2"/>
+				<w:characterSpacingControl w:val="compressPunctuation"/>
+				<w:hdrShapeDefaults>
+					<o:shapedefaults spidmax="19458" v:ext="edit"/>
+				</w:hdrShapeDefaults>
+				<w:footnotePr>
+					<w:footnote w:id="-1"/>
+					<w:footnote w:id="0"/>
+				</w:footnotePr>
+				<w:endnotePr>
+					<w:endnote w:id="-1"/>
+					<w:endnote w:id="0"/>
+				</w:endnotePr>
+				<w:compat>
+					<w:spaceForUL/>
+					<w:balanceSingleByteDoubleByteWidth/>
+					<w:doNotLeaveBackslashAlone/>
+					<w:ulTrailSpace/>
+					<w:doNotExpandShiftReturn/>
+					<w:adjustLineHeightInTable/>
+					<w:useFELayout/>
+				</w:compat>
+				<w:rsids>
+					<w:rsidRoot w:val="0087455D"/>
+					<w:rsid w:val="000132C5"/>
+					<w:rsid w:val="00024CBE"/>
+					<w:rsid w:val="000406AE"/>
+					<w:rsid w:val="000B674A"/>
+					<w:rsid w:val="000D3B88"/>
+					<w:rsid w:val="000F21AA"/>
+					<w:rsid w:val="001205CF"/>
+					<w:rsid w:val="001B047E"/>
+					<w:rsid w:val="001D5DC4"/>
+					<w:rsid w:val="001E7A22"/>
+					<w:rsid w:val="001F2ECE"/>
+					<w:rsid w:val="002003E2"/>
+					<w:rsid w:val="00227B5A"/>
+					<w:rsid w:val="0025692A"/>
+					<w:rsid w:val="00265F56"/>
+					<w:rsid w:val="00276CB1"/>
+					<w:rsid w:val="00277E0A"/>
+					<w:rsid w:val="00284E93"/>
+					<w:rsid w:val="002D7BB7"/>
+					<w:rsid w:val="002E7EEF"/>
+					<w:rsid w:val="00305708"/>
+					<w:rsid w:val="0031611B"/>
+					<w:rsid w:val="003430DB"/>
+					<w:rsid w:val="003431DB"/>
+					<w:rsid w:val="00351004"/>
+					<w:rsid w:val="003B106C"/>
+					<w:rsid w:val="003F39E3"/>
+					<w:rsid w:val="00424C9A"/>
+					<w:rsid w:val="00436E43"/>
+					<w:rsid w:val="004A272D"/>
+					<w:rsid w:val="004C27BD"/>
+					<w:rsid w:val="00514D56"/>
+					<w:rsid w:val="0052773A"/>
+					<w:rsid w:val="00565DEB"/>
+					<w:rsid w:val="00597650"/>
+					<w:rsid w:val="005D3181"/>
+					<w:rsid w:val="005D7B86"/>
+					<w:rsid w:val="005E2F7D"/>
+					<w:rsid w:val="005F72E9"/>
+					<w:rsid w:val="00651DB0"/>
+					<w:rsid w:val="00690AA4"/>
+					<w:rsid w:val="006B7181"/>
+					<w:rsid w:val="006C1A12"/>
+					<w:rsid w:val="006F4609"/>
+					<w:rsid w:val="00774F8C"/>
+					<w:rsid w:val="007D566B"/>
+					<w:rsid w:val="007E43A4"/>
+					<w:rsid w:val="008577DB"/>
+					<w:rsid w:val="00871331"/>
+					<w:rsid w:val="0087455D"/>
+					<w:rsid w:val="00893885"/>
+					<w:rsid w:val="008978E3"/>
+					<w:rsid w:val="008A24B3"/>
+					<w:rsid w:val="008C75CD"/>
+					<w:rsid w:val="008E07EF"/>
+					<w:rsid w:val="008E52A2"/>
+					<w:rsid w:val="00932CB6"/>
+					<w:rsid w:val="00942AE2"/>
+					<w:rsid w:val="00943214"/>
+					<w:rsid w:val="00964ABD"/>
+					<w:rsid w:val="00994466"/>
+					<w:rsid w:val="00995166"/>
+					<w:rsid w:val="009B54AB"/>
+					<w:rsid w:val="009C4971"/>
+					<w:rsid w:val="009D0B0B"/>
+					<w:rsid w:val="009E251D"/>
+					<w:rsid w:val="009E2A4C"/>
+					<w:rsid w:val="009F5E3D"/>
+					<w:rsid w:val="00A01107"/>
+					<w:rsid w:val="00A03F4D"/>
+					<w:rsid w:val="00A67382"/>
+					<w:rsid w:val="00A70242"/>
+					<w:rsid w:val="00AC13C7"/>
+					<w:rsid w:val="00B048F8"/>
+					<w:rsid w:val="00B704A0"/>
+					<w:rsid w:val="00B76E7E"/>
+					<w:rsid w:val="00B82216"/>
+					<w:rsid w:val="00BA4DC0"/>
+					<w:rsid w:val="00C1051F"/>
+					<w:rsid w:val="00C12328"/>
+					<w:rsid w:val="00C85FAD"/>
+					<w:rsid w:val="00C96D15"/>
+					<w:rsid w:val="00CB762B"/>
+					<w:rsid w:val="00CE3EE6"/>
+					<w:rsid w:val="00D21F17"/>
+					<w:rsid w:val="00D3248E"/>
+					<w:rsid w:val="00D34A92"/>
+					<w:rsid w:val="00D44FD2"/>
+					<w:rsid w:val="00D72CE0"/>
+					<w:rsid w:val="00D8374F"/>
+					<w:rsid w:val="00D90990"/>
+					<w:rsid w:val="00DC425C"/>
+					<w:rsid w:val="00DD0E5E"/>
+					<w:rsid w:val="00E007AD"/>
+					<w:rsid w:val="00E7057B"/>
+					<w:rsid w:val="00E71751"/>
+					<w:rsid w:val="00E76006"/>
+					<w:rsid w:val="00E8776A"/>
+					<w:rsid w:val="00EC2CA9"/>
+					<w:rsid w:val="00ED3421"/>
+					<w:rsid w:val="00EE09A8"/>
+					<w:rsid w:val="00EE670F"/>
+					<w:rsid w:val="00F35998"/>
+					<w:rsid w:val="00F62967"/>
+					<w:rsid w:val="00FC0BCE"/>
+					<w:rsid w:val="00FC6518"/>
+					<w:rsid w:val="00FC6E7D"/>
+					<w:rsid w:val="00FE23C2"/>
+				</w:rsids>
+				<m:mathPr>
+					<m:mathFont m:val="Cambria Math"/>
+					<m:brkBin m:val="before"/>
+					<m:brkBinSub m:val="--"/>
+					<m:smallFrac m:val="off"/>
+					<m:dispDef/>
+					<m:lMargin m:val="0"/>
+					<m:rMargin m:val="0"/>
+					<m:defJc m:val="centerGroup"/>
+					<m:wrapIndent m:val="1440"/>
+					<m:intLim m:val="subSup"/>
+					<m:naryLim m:val="undOvr"/>
+				</m:mathPr>
+				<w:themeFontLang w:eastAsia="zh-CN" w:val="en-US"/>
+				<w:clrSchemeMapping w:accent1="accent1" w:accent2="accent2" w:accent3="accent3" w:accent4="accent4" w:accent5="accent5" w:accent6="accent6" w:bg1="light1" w:bg2="light2" w:followedHyperlink="followedHyperlink" w:hyperlink="hyperlink" w:t1="dark1" w:t2="dark2"/>
+				<w:shapeDefaults>
+					<o:shapedefaults spidmax="19458" v:ext="edit"/>
+					<o:shapelayout v:ext="edit">
+						<o:idmap data="2" v:ext="edit"/>
+					</o:shapelayout>
+				</w:shapeDefaults>
+				<w:decimalSymbol w:val="."/>
+				<w:listSeparator w:val=","/>
+			</w:settings>
+		</pkg:xmlData>
+	</pkg:part>
+	<pkg:part pkg:contentType="application/vnd.openxmlformats-officedocument.wordprocessingml.webSettings+xml" pkg:name="/word/webSettings.xml">
+		<pkg:xmlData>
+			<w:webSettings xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
+				<w:optimizeForBrowser/>
+				<w:allowPNG/>
+			</w:webSettings>
+		</pkg:xmlData>
+	</pkg:part>
+	<pkg:part pkg:contentType="application/vnd.openxmlformats-package.core-properties+xml" pkg:name="/docProps/core.xml" pkg:padding="256">
+		<pkg:xmlData>
+			<cp:coreProperties xmlns:cp="http://schemas.openxmlformats.org/package/2006/metadata/core-properties" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcmitype="http://purl.org/dc/dcmitype/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+				<dc:creator>爱飞雪</dc:creator>
+				<cp:lastModifiedBy>weiwenhai</cp:lastModifiedBy>
+				<cp:revision>2</cp:revision>
+				<dcterms:created xsi:type="dcterms:W3CDTF">2018-09-04T06:30:00Z</dcterms:created>
+				<dcterms:modified xsi:type="dcterms:W3CDTF">2018-09-04T06:30:00Z</dcterms:modified>
+			</cp:coreProperties>
+		</pkg:xmlData>
+	</pkg:part>
+	<pkg:part pkg:contentType="application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml" pkg:name="/word/styles.xml">
+		<pkg:xmlData>
+			<w:styles xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
+				<w:docDefaults>
+					<w:rPrDefault>
+						<w:rPr>
+							<w:rFonts w:asciiTheme="minorHAnsi" w:cstheme="minorBidi" w:eastAsiaTheme="minorEastAsia" w:hAnsiTheme="minorHAnsi"/>
+							<w:kern w:val="2"/>
+							<w:sz w:val="21"/>
+							<w:szCs w:val="22"/>
+							<w:lang w:bidi="ar-SA" w:eastAsia="zh-CN" w:val="en-US"/>
+						</w:rPr>
+					</w:rPrDefault>
+					<w:pPrDefault/>
+				</w:docDefaults>
+				<w:latentStyles w:count="267" w:defLockedState="0" w:defQFormat="0" w:defSemiHidden="1" w:defUIPriority="99" w:defUnhideWhenUsed="1">
+					<w:lsdException w:name="Normal" w:qFormat="1" w:semiHidden="0" w:uiPriority="0" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="heading 1" w:qFormat="1" w:semiHidden="0" w:uiPriority="9" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="heading 2" w:qFormat="1" w:uiPriority="9"/>
+					<w:lsdException w:name="heading 3" w:qFormat="1" w:uiPriority="9"/>
+					<w:lsdException w:name="heading 4" w:qFormat="1" w:uiPriority="9"/>
+					<w:lsdException w:name="heading 5" w:qFormat="1" w:uiPriority="9"/>
+					<w:lsdException w:name="heading 6" w:qFormat="1" w:uiPriority="9"/>
+					<w:lsdException w:name="heading 7" w:qFormat="1" w:uiPriority="9"/>
+					<w:lsdException w:name="heading 8" w:qFormat="1" w:uiPriority="9"/>
+					<w:lsdException w:name="heading 9" w:qFormat="1" w:uiPriority="9"/>
+					<w:lsdException w:name="toc 1" w:uiPriority="39"/>
+					<w:lsdException w:name="toc 2" w:uiPriority="39"/>
+					<w:lsdException w:name="toc 3" w:uiPriority="39"/>
+					<w:lsdException w:name="toc 4" w:uiPriority="39"/>
+					<w:lsdException w:name="toc 5" w:uiPriority="39"/>
+					<w:lsdException w:name="toc 6" w:uiPriority="39"/>
+					<w:lsdException w:name="toc 7" w:uiPriority="39"/>
+					<w:lsdException w:name="toc 8" w:uiPriority="39"/>
+					<w:lsdException w:name="toc 9" w:uiPriority="39"/>
+					<w:lsdException w:name="caption" w:qFormat="1" w:uiPriority="35"/>
+					<w:lsdException w:name="Title" w:qFormat="1" w:semiHidden="0" w:uiPriority="10" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Default Paragraph Font" w:uiPriority="1"/>
+					<w:lsdException w:name="Subtitle" w:qFormat="1" w:semiHidden="0" w:uiPriority="11" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Strong" w:qFormat="1" w:semiHidden="0" w:uiPriority="22" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Emphasis" w:qFormat="1" w:semiHidden="0" w:uiPriority="20" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Table Grid" w:semiHidden="0" w:uiPriority="59" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Placeholder Text" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="No Spacing" w:qFormat="1" w:semiHidden="0" w:uiPriority="1" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Light Shading" w:semiHidden="0" w:uiPriority="60" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Light List" w:semiHidden="0" w:uiPriority="61" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Light Grid" w:semiHidden="0" w:uiPriority="62" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Medium Shading 1" w:semiHidden="0" w:uiPriority="63" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Medium Shading 2" w:semiHidden="0" w:uiPriority="64" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Medium List 1" w:semiHidden="0" w:uiPriority="65" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Medium List 2" w:semiHidden="0" w:uiPriority="66" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Medium Grid 1" w:semiHidden="0" w:uiPriority="67" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Medium Grid 2" w:semiHidden="0" w:uiPriority="68" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Medium Grid 3" w:semiHidden="0" w:uiPriority="69" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Dark List" w:semiHidden="0" w:uiPriority="70" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Colorful Shading" w:semiHidden="0" w:uiPriority="71" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Colorful List" w:semiHidden="0" w:uiPriority="72" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Colorful Grid" w:semiHidden="0" w:uiPriority="73" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Light Shading Accent 1" w:semiHidden="0" w:uiPriority="60" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Light List Accent 1" w:semiHidden="0" w:uiPriority="61" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Light Grid Accent 1" w:semiHidden="0" w:uiPriority="62" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Medium Shading 1 Accent 1" w:semiHidden="0" w:uiPriority="63" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Medium Shading 2 Accent 1" w:semiHidden="0" w:uiPriority="64" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Medium List 1 Accent 1" w:semiHidden="0" w:uiPriority="65" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Revision" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="List Paragraph" w:qFormat="1" w:semiHidden="0" w:uiPriority="34" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Quote" w:qFormat="1" w:semiHidden="0" w:uiPriority="29" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Intense Quote" w:qFormat="1" w:semiHidden="0" w:uiPriority="30" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Medium List 2 Accent 1" w:semiHidden="0" w:uiPriority="66" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Medium Grid 1 Accent 1" w:semiHidden="0" w:uiPriority="67" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Medium Grid 2 Accent 1" w:semiHidden="0" w:uiPriority="68" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Medium Grid 3 Accent 1" w:semiHidden="0" w:uiPriority="69" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Dark List Accent 1" w:semiHidden="0" w:uiPriority="70" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Colorful Shading Accent 1" w:semiHidden="0" w:uiPriority="71" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Colorful List Accent 1" w:semiHidden="0" w:uiPriority="72" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Colorful Grid Accent 1" w:semiHidden="0" w:uiPriority="73" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Light Shading Accent 2" w:semiHidden="0" w:uiPriority="60" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Light List Accent 2" w:semiHidden="0" w:uiPriority="61" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Light Grid Accent 2" w:semiHidden="0" w:uiPriority="62" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Medium Shading 1 Accent 2" w:semiHidden="0" w:uiPriority="63" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Medium Shading 2 Accent 2" w:semiHidden="0" w:uiPriority="64" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Medium List 1 Accent 2" w:semiHidden="0" w:uiPriority="65" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Medium List 2 Accent 2" w:semiHidden="0" w:uiPriority="66" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Medium Grid 1 Accent 2" w:semiHidden="0" w:uiPriority="67" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Medium Grid 2 Accent 2" w:semiHidden="0" w:uiPriority="68" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Medium Grid 3 Accent 2" w:semiHidden="0" w:uiPriority="69" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Dark List Accent 2" w:semiHidden="0" w:uiPriority="70" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Colorful Shading Accent 2" w:semiHidden="0" w:uiPriority="71" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Colorful List Accent 2" w:semiHidden="0" w:uiPriority="72" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Colorful Grid Accent 2" w:semiHidden="0" w:uiPriority="73" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Light Shading Accent 3" w:semiHidden="0" w:uiPriority="60" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Light List Accent 3" w:semiHidden="0" w:uiPriority="61" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Light Grid Accent 3" w:semiHidden="0" w:uiPriority="62" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Medium Shading 1 Accent 3" w:semiHidden="0" w:uiPriority="63" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Medium Shading 2 Accent 3" w:semiHidden="0" w:uiPriority="64" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Medium List 1 Accent 3" w:semiHidden="0" w:uiPriority="65" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Medium List 2 Accent 3" w:semiHidden="0" w:uiPriority="66" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Medium Grid 1 Accent 3" w:semiHidden="0" w:uiPriority="67" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Medium Grid 2 Accent 3" w:semiHidden="0" w:uiPriority="68" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Medium Grid 3 Accent 3" w:semiHidden="0" w:uiPriority="69" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Dark List Accent 3" w:semiHidden="0" w:uiPriority="70" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Colorful Shading Accent 3" w:semiHidden="0" w:uiPriority="71" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Colorful List Accent 3" w:semiHidden="0" w:uiPriority="72" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Colorful Grid Accent 3" w:semiHidden="0" w:uiPriority="73" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Light Shading Accent 4" w:semiHidden="0" w:uiPriority="60" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Light List Accent 4" w:semiHidden="0" w:uiPriority="61" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Light Grid Accent 4" w:semiHidden="0" w:uiPriority="62" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Medium Shading 1 Accent 4" w:semiHidden="0" w:uiPriority="63" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Medium Shading 2 Accent 4" w:semiHidden="0" w:uiPriority="64" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Medium List 1 Accent 4" w:semiHidden="0" w:uiPriority="65" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Medium List 2 Accent 4" w:semiHidden="0" w:uiPriority="66" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Medium Grid 1 Accent 4" w:semiHidden="0" w:uiPriority="67" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Medium Grid 2 Accent 4" w:semiHidden="0" w:uiPriority="68" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Medium Grid 3 Accent 4" w:semiHidden="0" w:uiPriority="69" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Dark List Accent 4" w:semiHidden="0" w:uiPriority="70" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Colorful Shading Accent 4" w:semiHidden="0" w:uiPriority="71" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Colorful List Accent 4" w:semiHidden="0" w:uiPriority="72" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Colorful Grid Accent 4" w:semiHidden="0" w:uiPriority="73" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Light Shading Accent 5" w:semiHidden="0" w:uiPriority="60" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Light List Accent 5" w:semiHidden="0" w:uiPriority="61" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Light Grid Accent 5" w:semiHidden="0" w:uiPriority="62" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Medium Shading 1 Accent 5" w:semiHidden="0" w:uiPriority="63" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Medium Shading 2 Accent 5" w:semiHidden="0" w:uiPriority="64" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Medium List 1 Accent 5" w:semiHidden="0" w:uiPriority="65" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Medium List 2 Accent 5" w:semiHidden="0" w:uiPriority="66" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Medium Grid 1 Accent 5" w:semiHidden="0" w:uiPriority="67" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Medium Grid 2 Accent 5" w:semiHidden="0" w:uiPriority="68" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Medium Grid 3 Accent 5" w:semiHidden="0" w:uiPriority="69" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Dark List Accent 5" w:semiHidden="0" w:uiPriority="70" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Colorful Shading Accent 5" w:semiHidden="0" w:uiPriority="71" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Colorful List Accent 5" w:semiHidden="0" w:uiPriority="72" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Colorful Grid Accent 5" w:semiHidden="0" w:uiPriority="73" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Light Shading Accent 6" w:semiHidden="0" w:uiPriority="60" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Light List Accent 6" w:semiHidden="0" w:uiPriority="61" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Light Grid Accent 6" w:semiHidden="0" w:uiPriority="62" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Medium Shading 1 Accent 6" w:semiHidden="0" w:uiPriority="63" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Medium Shading 2 Accent 6" w:semiHidden="0" w:uiPriority="64" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Medium List 1 Accent 6" w:semiHidden="0" w:uiPriority="65" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Medium List 2 Accent 6" w:semiHidden="0" w:uiPriority="66" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Medium Grid 1 Accent 6" w:semiHidden="0" w:uiPriority="67" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Medium Grid 2 Accent 6" w:semiHidden="0" w:uiPriority="68" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Medium Grid 3 Accent 6" w:semiHidden="0" w:uiPriority="69" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Dark List Accent 6" w:semiHidden="0" w:uiPriority="70" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Colorful Shading Accent 6" w:semiHidden="0" w:uiPriority="71" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Colorful List Accent 6" w:semiHidden="0" w:uiPriority="72" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Colorful Grid Accent 6" w:semiHidden="0" w:uiPriority="73" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Subtle Emphasis" w:qFormat="1" w:semiHidden="0" w:uiPriority="19" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Intense Emphasis" w:qFormat="1" w:semiHidden="0" w:uiPriority="21" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Subtle Reference" w:qFormat="1" w:semiHidden="0" w:uiPriority="31" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Intense Reference" w:qFormat="1" w:semiHidden="0" w:uiPriority="32" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Book Title" w:qFormat="1" w:semiHidden="0" w:uiPriority="33" w:unhideWhenUsed="0"/>
+					<w:lsdException w:name="Bibliography" w:uiPriority="37"/>
+					<w:lsdException w:name="TOC Heading" w:qFormat="1" w:uiPriority="39"/>
+				</w:latentStyles>
+				<w:style w:default="1" w:styleId="a" w:type="paragraph">
+					<w:name w:val="Normal"/>
+					<w:qFormat/>
+					<w:rsid w:val="00F62967"/>
+					<w:pPr>
+						<w:widowControl w:val="0"/>
+						<w:jc w:val="both"/>
+					</w:pPr>
+				</w:style>
+				<w:style w:default="1" w:styleId="a0" w:type="character">
+					<w:name w:val="Default Paragraph Font"/>
+					<w:uiPriority w:val="1"/>
+					<w:semiHidden/>
+					<w:unhideWhenUsed/>
+				</w:style>
+				<w:style w:default="1" w:styleId="a1" w:type="table">
+					<w:name w:val="Normal Table"/>
+					<w:uiPriority w:val="99"/>
+					<w:semiHidden/>
+					<w:unhideWhenUsed/>
+					<w:qFormat/>
+					<w:tblPr>
+						<w:tblInd w:type="dxa" w:w="0"/>
+						<w:tblCellMar>
+							<w:top w:type="dxa" w:w="0"/>
+							<w:left w:type="dxa" w:w="108"/>
+							<w:bottom w:type="dxa" w:w="0"/>
+							<w:right w:type="dxa" w:w="108"/>
+						</w:tblCellMar>
+					</w:tblPr>
+				</w:style>
+				<w:style w:default="1" w:styleId="a2" w:type="numbering">
+					<w:name w:val="No List"/>
+					<w:uiPriority w:val="99"/>
+					<w:semiHidden/>
+					<w:unhideWhenUsed/>
+				</w:style>
+				<w:style w:styleId="a3" w:type="paragraph">
+					<w:name w:val="header"/>
+					<w:basedOn w:val="a"/>
+					<w:link w:val="Char"/>
+					<w:uiPriority w:val="99"/>
+					<w:semiHidden/>
+					<w:unhideWhenUsed/>
+					<w:rsid w:val="0087455D"/>
+					<w:pPr>
+						<w:pBdr>
+							<w:bottom w:color="auto" w:space="1" w:sz="6" w:val="single"/>
+						</w:pBdr>
+						<w:tabs>
+							<w:tab w:pos="4153" w:val="center"/>
+							<w:tab w:pos="8306" w:val="right"/>
+						</w:tabs>
+						<w:snapToGrid w:val="0"/>
+						<w:jc w:val="center"/>
+					</w:pPr>
+					<w:rPr>
+						<w:sz w:val="18"/>
+						<w:szCs w:val="18"/>
+					</w:rPr>
+				</w:style>
+				<w:style w:customStyle="1" w:styleId="Char" w:type="character">
+					<w:name w:val="页眉 Char"/>
+					<w:basedOn w:val="a0"/>
+					<w:link w:val="a3"/>
+					<w:uiPriority w:val="99"/>
+					<w:semiHidden/>
+					<w:rsid w:val="0087455D"/>
+					<w:rPr>
+						<w:sz w:val="18"/>
+						<w:szCs w:val="18"/>
+					</w:rPr>
+				</w:style>
+				<w:style w:styleId="a4" w:type="paragraph">
+					<w:name w:val="footer"/>
+					<w:basedOn w:val="a"/>
+					<w:link w:val="Char0"/>
+					<w:uiPriority w:val="99"/>
+					<w:semiHidden/>
+					<w:unhideWhenUsed/>
+					<w:rsid w:val="0087455D"/>
+					<w:pPr>
+						<w:tabs>
+							<w:tab w:pos="4153" w:val="center"/>
+							<w:tab w:pos="8306" w:val="right"/>
+						</w:tabs>
+						<w:snapToGrid w:val="0"/>
+						<w:jc w:val="left"/>
+					</w:pPr>
+					<w:rPr>
+						<w:sz w:val="18"/>
+						<w:szCs w:val="18"/>
+					</w:rPr>
+				</w:style>
+				<w:style w:customStyle="1" w:styleId="Char0" w:type="character">
+					<w:name w:val="页脚 Char"/>
+					<w:basedOn w:val="a0"/>
+					<w:link w:val="a4"/>
+					<w:uiPriority w:val="99"/>
+					<w:semiHidden/>
+					<w:rsid w:val="0087455D"/>
+					<w:rPr>
+						<w:sz w:val="18"/>
+						<w:szCs w:val="18"/>
+					</w:rPr>
+				</w:style>
+			</w:styles>
+		</pkg:xmlData>
+	</pkg:part>
+	<pkg:part pkg:contentType="application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+xml" pkg:name="/word/fontTable.xml">
+		<pkg:xmlData>
+			<w:fonts xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
+				<w:font w:name="Calibri">
+					<w:panose1 w:val="020F0502020204030204"/>
+					<w:charset w:val="00"/>
+					<w:family w:val="swiss"/>
+					<w:pitch w:val="variable"/>
+					<w:sig w:csb0="000001FF" w:csb1="00000000" w:usb0="E0002AFF" w:usb1="C000247B" w:usb2="00000009" w:usb3="00000000"/>
+				</w:font>
+				<w:font w:name="宋体">
+					<w:altName w:val="SimSun"/>
+					<w:panose1 w:val="02010600030101010101"/>
+					<w:charset w:val="86"/>
+					<w:family w:val="auto"/>
+					<w:pitch w:val="variable"/>
+					<w:sig w:csb0="00040001" w:csb1="00000000" w:usb0="00000003" w:usb1="288F0000" w:usb2="00000016" w:usb3="00000000"/>
+				</w:font>
+				<w:font w:name="Times New Roman">
+					<w:panose1 w:val="02020603050405020304"/>
+					<w:charset w:val="00"/>
+					<w:family w:val="roman"/>
+					<w:pitch w:val="variable"/>
+					<w:sig w:csb0="000001FF" w:csb1="00000000" w:usb0="E0002EFF" w:usb1="C000785B" w:usb2="00000009" w:usb3="00000000"/>
+				</w:font>
+				<w:font w:name="Arial">
+					<w:panose1 w:val="020B0604020202020204"/>
+					<w:charset w:val="00"/>
+					<w:family w:val="swiss"/>
+					<w:pitch w:val="variable"/>
+					<w:sig w:csb0="000001FF" w:csb1="00000000" w:usb0="E0002EFF" w:usb1="C0007843" w:usb2="00000009" w:usb3="00000000"/>
+				</w:font>
+				<w:font w:name="Cambria">
+					<w:panose1 w:val="02040503050406030204"/>
+					<w:charset w:val="00"/>
+					<w:family w:val="roman"/>
+					<w:pitch w:val="variable"/>
+					<w:sig w:csb0="0000019F" w:csb1="00000000" w:usb0="E00006FF" w:usb1="400004FF" w:usb2="00000000" w:usb3="00000000"/>
+				</w:font>
+			</w:fonts>
+		</pkg:xmlData>
+	</pkg:part>
+	<pkg:part pkg:contentType="application/vnd.openxmlformats-officedocument.extended-properties+xml" pkg:name="/docProps/app.xml" pkg:padding="256">
+		<pkg:xmlData>
+			<Properties xmlns="http://schemas.openxmlformats.org/officeDocument/2006/extended-properties" xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes">
+				<Template>Normal.dotm</Template>
+				<TotalTime>3</TotalTime>
+				<Pages>1</Pages>
+				<Words>26</Words>
+				<Characters>153</Characters>
+				<Application>Microsoft Office Word</Application>
+				<DocSecurity>0</DocSecurity>
+				<Lines>1</Lines>
+				<Paragraphs>1</Paragraphs>
+				<ScaleCrop>false</ScaleCrop>
+				<Company/>
+				<LinksUpToDate>false</LinksUpToDate>
+				<CharactersWithSpaces>178</CharactersWithSpaces>
+				<SharedDoc>false</SharedDoc>
+				<HyperlinksChanged>false</HyperlinksChanged>
+				<AppVersion>12.0000</AppVersion>
+			</Properties>
+		</pkg:xmlData>
+	</pkg:part>
+</pkg:package>

+ 3 - 1
examcloud-core-questions-dao/src/main/java/cn/com/qmth/examcloud/core/questions/dao/CoursePropertyRepo.java

@@ -30,5 +30,7 @@ public interface CoursePropertyRepo extends JpaRepository<CourseProperty, Long>,
 	
 	//根据课程id查询已经开启的课程属性
 	List<CourseProperty> findByCourseIdAndEnable(Long courseId,Boolean enable);
-
+	
+	//根据id集合查询
+	List<CourseProperty> findByIdIn(List<Long> ids);
 }

+ 2 - 0
examcloud-core-questions-dao/src/main/java/cn/com/qmth/examcloud/core/questions/dao/QuesRepo.java

@@ -27,4 +27,6 @@ public interface QuesRepo extends MongoRepository<Question, String>, QueryByExam
     List<Question> findBySpecialtyCodeAndOrgId(String specialtyCode,String orgId);
     
     List<Question> findByCourseAndOrgId(Course course,String orgId);
+    
+    List<Question> findByIdIn(Set<String> ids);
 }

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

@@ -47,15 +47,15 @@ public class PaperDetailStruct implements Serializable{
 	
 	private Integer publicSimpleCount; //公开简单总数
 	
-	private Integer publicMediumCount; //公开简单总数
+	private Integer publicMediumCount; //公开中等总数
 	
-	private Integer publicDifficultyCount; //公开简单总数
+	private Integer publicDifficultyCount; //公开困难总数
 	
-	private Integer noPublicSimpleCount; //公开简单总数
+	private Integer noPublicSimpleCount; //公开简单总数
 	
-	private Integer noPublicMediumCount; //公开简单总数
+	private Integer noPublicMediumCount; //非公开中等总数
 	
-	private Integer noPublicDifficultyCount; //公开简单总数  coursePropertyNumberDtos
+	private Integer noPublicDifficultyCount; //非公开困难总数  coursePropertyNumberDtos
 	
 	private List<CoursePropertyNumberDto> coursePropertyNumberDtos;
 	

+ 61 - 0
examcloud-core-questions-dao/src/main/java/cn/com/qmth/examcloud/core/questions/dao/entity/dto/PaperDetailUnitStructDto.java

@@ -23,6 +23,18 @@ public class PaperDetailUnitStructDto implements Serializable {
     private QuesStructType questionType;//小题类型
 
     private List<String> quesNames;//来源大题
+    
+    private Integer publicSimple;//公开简单数量
+    
+    private Integer publicMedium;//公开中等数量
+    
+    private Integer publicDifficulty;//公开困难数量
+    
+    private Integer noPublicSimple;//非公开简单数量
+    
+    private Integer noPublicMedium;//非公开中等数量
+    
+    private Integer noPublicDifficulty;//非公开困难数量
 
     public static long getSerialVersionUID() {
         return serialVersionUID;
@@ -75,4 +87,53 @@ public class PaperDetailUnitStructDto implements Serializable {
     public void setQuesNames(List<String> quesNames) {
         this.quesNames = quesNames;
     }
+
+	public Integer getPublicSimple() {
+		return publicSimple;
+	}
+
+	public void setPublicSimple(Integer publicSimple) {
+		this.publicSimple = publicSimple;
+	}
+
+	public Integer getPublicMedium() {
+		return publicMedium;
+	}
+
+	public void setPublicMedium(Integer publicMedium) {
+		this.publicMedium = publicMedium;
+	}
+
+	public Integer getPublicDifficulty() {
+		return publicDifficulty;
+	}
+
+	public void setPublicDifficulty(Integer publicDifficulty) {
+		this.publicDifficulty = publicDifficulty;
+	}
+
+	public Integer getNoPublicSimple() {
+		return noPublicSimple;
+	}
+
+	public void setNoPublicSimple(Integer noPublicSimple) {
+		this.noPublicSimple = noPublicSimple;
+	}
+
+	public Integer getNoPublicMedium() {
+		return noPublicMedium;
+	}
+
+	public void setNoPublicMedium(Integer noPublicMedium) {
+		this.noPublicMedium = noPublicMedium;
+	}
+
+	public Integer getNoPublicDifficulty() {
+		return noPublicDifficulty;
+	}
+
+	public void setNoPublicDifficulty(Integer noPublicDifficulty) {
+		this.noPublicDifficulty = noPublicDifficulty;
+	}
+    
 }

+ 16 - 2
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/CoursePropertyService.java

@@ -41,14 +41,14 @@ public interface CoursePropertyService {
 	 * @param id
 	 * @param orgId
 	 */
-	public void openCourseProperty(Long id, Long orgId);
+	public void openCourseProperty(Long id);
 	
 	/**
 	 * 禁用
 	 * @param id
 	 * @param orgId
 	 */
-	public void closeCourseProperty(Long id ,Long orgId);
+	public void closeCourseProperty(Long id);
 	
 	/**
 	 * 根据课程id查询所有课程属性
@@ -71,4 +71,18 @@ public interface CoursePropertyService {
 	 * @return
 	 */
 	public List<CourseProperty> findAllEnable(String code, Boolean enable);
+
+	/**
+	 * 批量启用
+	 * @param idList
+	 * @param orgId
+	 */
+	public void opensCourseProperty(List<String> idList);
+
+	/**
+	 * 批量禁用
+	 * @param idList
+	 * @param orgId
+	 */
+	public void closesCourseProperty(List<String> idList);
 }

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

@@ -1,6 +1,7 @@
 package cn.com.qmth.examcloud.core.questions.service;
 
 import javax.servlet.http.HttpServletResponse;
+
 import java.io.IOException;
 import java.util.List;
 
@@ -37,4 +38,13 @@ public interface ExportPaperService {
      * @param response
      */
     public void downQuestionDistribute(String courseNo, HttpServletResponse response) throws IOException;
+    
+    /**
+     * 导出原始的导入试卷
+     * @param paperId
+     * @param response
+     * @throws Exception
+     */
+    public void downOriginalPaper(String paperId, String loginName, HttpServletResponse response) throws Exception;
+    
 }

+ 9 - 0
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/ExtractConfigProviderService.java

@@ -1,6 +1,8 @@
 package cn.com.qmth.examcloud.core.questions.service;
 
+import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import cn.com.qmth.examcloud.core.questions.dao.entity.Paper;
 import cn.com.qmth.examcloud.question.core.paper.DefaultPaper;
@@ -37,4 +39,11 @@ public interface ExtractConfigProviderService {
 	 * @return
 	 */
 	public DefaultPaper getBaseDefaultPaper(String paperId);
+	
+	/**
+	 * 根据试题id集合获取试题对象集合
+	 * @param questionIds
+	 * @return
+	 */
+	public Map<String, DefaultQuestion> getDefaultQuestions(Set<String> questionIds);
 }

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

@@ -274,4 +274,11 @@ public interface PaperService {
 	 * @param paperId
 	 */
 	public QuestionAllTypeDto findQuestionStructure(String paperId,User user) throws Exception;
+	
+	/**
+     * 导出试卷Dto
+     * @param paperId
+     * @return
+     */
+    public PaperExp getDownPaperExp(String paperId) throws Exception;
 }

+ 87 - 4
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/PaperStructService.java

@@ -158,16 +158,90 @@ public class PaperStructService {
                 }
                 List<PaperDetailUnitStruct> unitStructs = new ArrayList<PaperDetailUnitStruct>();
                 for (PaperDetailUnitStructDto unitStructDto : paperDetailStruct.getUnitStructs()) {
-                    for (int i = 0; i < unitStructDto.getCount(); i++) {
-                        ++number;
-                        PaperDetailUnitStruct unitStruct = new PaperDetailUnitStruct();
+                	//公开简单总数
+                	for(int i = 0;i<unitStructDto.getPublicSimple();i++){
+                		++number;
+                		PaperDetailUnitStruct unitStruct = new PaperDetailUnitStruct();
+                        unitStruct.setDifficulty("易");
+                		unitStruct.setPublicity(true);
+                        unitStruct.setId(String.valueOf(number));
+                        unitStruct.setNumber(number);
                         unitStruct.setScore(unitStructDto.getScore());
+                        unitStruct.setQuestionType(unitStructDto.getQuestionType());
+                        unitStruct.setQuesNames(unitStructDto.getQuesNames());
+                        unitStruct.setPropertyGroup(buildGroup(unitStruct));
+                        unitStructs.add(unitStruct);
+                	}
+                	//公开中等总数
+                	for(int i = 0;i<unitStructDto.getPublicMedium();i++){
+                		++number;
+                		PaperDetailUnitStruct unitStruct = new PaperDetailUnitStruct();
+                        unitStruct.setDifficulty("中");
+                		unitStruct.setPublicity(true);
                         unitStruct.setId(String.valueOf(number));
                         unitStruct.setNumber(number);
+                        unitStruct.setScore(unitStructDto.getScore());
+                        unitStruct.setQuestionType(unitStructDto.getQuestionType());
+                        unitStruct.setQuesNames(unitStructDto.getQuesNames());
+                        unitStruct.setPropertyGroup(buildGroup(unitStruct));
+                        unitStructs.add(unitStruct);
+                	}
+                	//公开困难总数
+                	for(int i = 0;i<unitStructDto.getPublicDifficulty();i++){
+                		++number;
+                		PaperDetailUnitStruct unitStruct = new PaperDetailUnitStruct();
+                        unitStruct.setDifficulty("难");
+                		unitStruct.setPublicity(true);
+                        unitStruct.setId(String.valueOf(number));
+                        unitStruct.setNumber(number);
+                        unitStruct.setScore(unitStructDto.getScore());
+                        unitStruct.setQuestionType(unitStructDto.getQuestionType());
+                        unitStruct.setQuesNames(unitStructDto.getQuesNames());
+                        unitStruct.setPropertyGroup(buildGroup(unitStruct));
+                        unitStructs.add(unitStruct);
+                	}
+                	//非公开简单总数
+                	for(int i = 0;i<unitStructDto.getNoPublicSimple();i++){
+                		++number;
+                		PaperDetailUnitStruct unitStruct = new PaperDetailUnitStruct();
+                        unitStruct.setDifficulty("易");
+                		unitStruct.setPublicity(false);
+                        unitStruct.setId(String.valueOf(number));
+                        unitStruct.setNumber(number);
+                        unitStruct.setScore(unitStructDto.getScore());
                         unitStruct.setQuestionType(unitStructDto.getQuestionType());
                         unitStruct.setQuesNames(unitStructDto.getQuesNames());
+                        unitStruct.setPropertyGroup(buildGroup(unitStruct));
                         unitStructs.add(unitStruct);
-                    }
+                	}
+                	//非公开中等总数
+                	for(int i = 0;i<unitStructDto.getNoPublicMedium();i++){
+                		++number;
+                		PaperDetailUnitStruct unitStruct = new PaperDetailUnitStruct();
+                        unitStruct.setDifficulty("中");
+                		unitStruct.setPublicity(false);
+                        unitStruct.setId(String.valueOf(number));
+                        unitStruct.setNumber(number);
+                        unitStruct.setScore(unitStructDto.getScore());
+                        unitStruct.setQuestionType(unitStructDto.getQuestionType());
+                        unitStruct.setQuesNames(unitStructDto.getQuesNames());
+                        unitStruct.setPropertyGroup(buildGroup(unitStruct));
+                        unitStructs.add(unitStruct);
+                	}
+                	//非公开困难总数
+                	for(int i = 0;i<unitStructDto.getNoPublicDifficulty();i++){
+                		++number;
+                		PaperDetailUnitStruct unitStruct = new PaperDetailUnitStruct();
+                        unitStruct.setDifficulty("难");
+                		unitStruct.setPublicity(false);
+                        unitStruct.setId(String.valueOf(number));
+                        unitStruct.setNumber(number);
+                        unitStruct.setScore(unitStructDto.getScore());
+                        unitStruct.setQuestionType(unitStructDto.getQuestionType());
+                        unitStruct.setQuesNames(unitStructDto.getQuesNames());
+                        unitStruct.setPropertyGroup(buildGroup(unitStruct));
+                        unitStructs.add(unitStruct);
+                	}
                 }
                 paperDetailStruct.setPaperDetailUnitStructs(unitStructs);
             }
@@ -253,6 +327,15 @@ public class PaperStructService {
         paperStruct.setDetailCount(paperDetailStructs.size());
         return paperStructRepo.save(paperStruct);
     }
+    
+    /**
+     * 构建精确组建筛选条件
+     * @param unitStruct
+     * @return
+     */
+    private String buildGroup(PaperDetailUnitStruct unitStruct){
+    	return String.valueOf(unitStruct.getPublicity()) + "-" + unitStruct.getDifficulty();
+    }
 
     /**
      * 构建单个属性组(用来筛选题目)

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

@@ -29,7 +29,9 @@ public class GenPaperDto implements Serializable {
 
     private List<String> paperIds;// 试卷ID集合
 
-    private Map<String, Double> simpleParams;// 简单组卷规则
+    //private Map<String, Double> simpleParams;// 简单组卷规则
+    
+    private Map<String, NumberDto> simpleParams;// 简单组卷规则
 
     private List<Condition> conditions;// 精细组卷规则
 
@@ -79,15 +81,15 @@ public class GenPaperDto implements Serializable {
         this.paperIds = paperIds;
     }
 
-    public Map<String, Double> getSimpleParams() {
-        return simpleParams;
-    }
+	public Map<String, NumberDto> getSimpleParams() {
+		return simpleParams;
+	}
 
-    public void setSimpleParams(Map<String, Double> simpleParams) {
-        this.simpleParams = simpleParams;
-    }
+	public void setSimpleParams(Map<String, NumberDto> simpleParams) {
+		this.simpleParams = simpleParams;
+	}
 
-    public List<Condition> getConditions() {
+	public List<Condition> getConditions() {
         return conditions;
     }
 

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

@@ -0,0 +1,102 @@
+package cn.com.qmth.examcloud.core.questions.service.bean.dto;
+
+/**
+ * @author 		weiwenhai
+ * @date 		2018.8.30
+ * @company 	qmth
+ * @describle	简单组卷Dto
+ */
+public class NumberDto {
+
+	/**
+	 * 公开简答
+	 */
+	private Double publicSimple;
+
+	/**
+	 * 公开中等
+	 */
+	private Double publicMedium;
+	
+	/**
+	 * 公开困难
+	 */
+	private Double publicDifficulty;
+	
+	/**
+	 * 非公开简单
+	 */
+	private Double noPublicSimple;
+	
+	/**
+	 * 非公开中等
+	 */
+	private Double noPublicMedium;
+	
+	/**
+	 * 非公开困难
+	 */
+	private Double noPublicDifficulty;
+	
+	/**
+	 * 总数
+	 */
+	private Double count;
+
+	public Double getPublicSimple() {
+		return publicSimple;
+	}
+
+	public void setPublicSimple(Double publicSimple) {
+		this.publicSimple = publicSimple;
+	}
+
+	public Double getPublicMedium() {
+		return publicMedium;
+	}
+
+	public void setPublicMedium(Double publicMedium) {
+		this.publicMedium = publicMedium;
+	}
+
+	public Double getPublicDifficulty() {
+		return publicDifficulty;
+	}
+
+	public void setPublicDifficulty(Double publicDifficulty) {
+		this.publicDifficulty = publicDifficulty;
+	}
+
+	public Double getNoPublicSimple() {
+		return noPublicSimple;
+	}
+
+	public void setNoPublicSimple(Double noPublicSimple) {
+		this.noPublicSimple = noPublicSimple;
+	}
+
+	public Double getNoPublicMedium() {
+		return noPublicMedium;
+	}
+
+	public void setNoPublicMedium(Double noPublicMedium) {
+		this.noPublicMedium = noPublicMedium;
+	}
+
+	public Double getNoPublicDifficulty() {
+		return noPublicDifficulty;
+	}
+
+	public void setNoPublicDifficulty(Double noPublicDifficulty) {
+		this.noPublicDifficulty = noPublicDifficulty;
+	}
+
+	public Double getCount() {
+		return count;
+	}
+
+	public void setCount(Double count) {
+		this.count = count;
+	}
+	
+}

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

@@ -23,14 +23,6 @@ public class PaperDetailExp implements Serializable,Comparable<PaperDetailExp>{
     
     private String titleDetail;//标题详情
 
-    public String getTitleDetail() {
-		return titleDetail;
-	}
-
-	public void setTitleDetail(String titleDetail) {
-		this.titleDetail = titleDetail;
-	}
-
 	private Double score;//大题分数
 
     private Integer unitCount;//大题下的小题数量
@@ -42,6 +34,25 @@ public class PaperDetailExp implements Serializable,Comparable<PaperDetailExp>{
      */
     private Long sortNumber;
     
+    /**
+     * 导入模板中,【分数】
+     * (默认取第一个子题分数)
+     */
+    private Double firstScore;
+    
+    /**
+     * 题型
+     */
+    private String quesType;
+    
+    public String getTitleDetail() {
+		return titleDetail;
+	}
+
+	public void setTitleDetail(String titleDetail) {
+		this.titleDetail = titleDetail;
+	}
+    
 	public Long getSortNumber() {
 		return sortNumber;
 	}
@@ -121,8 +132,24 @@ public class PaperDetailExp implements Serializable,Comparable<PaperDetailExp>{
     public void setTitle(String title) {
         this.title = title;
     }
+    
+    public Double getFirstScore() {
+		return firstScore;
+	}
+
+	public void setFirstScore(Double firstScore) {
+		this.firstScore = firstScore;
+	}
+	
+	public String getQuesType() {
+		return quesType;
+	}
+
+	public void setQuesType(String quesType) {
+		this.quesType = quesType;
+	}
 
-    @Override
+	@Override
     public int compareTo(PaperDetailExp paperDetailExp) {
         if (paperDetailExp != null) {
             if(this.getNumber() == null)return -1;

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

@@ -30,6 +30,21 @@ public class PaperDetailUnitExp implements Serializable,Comparable<PaperDetailUn
     
     private String optionOrder;
     
+    /**
+     * 一级属性名称(默认取question中第一个)
+     */
+    private String firstName;
+    
+    /**
+     * 二级属性名称(默认取question中第一个)
+     */
+    private String secondName;
+    
+    /**
+     * 公开,非公开
+     */
+    private String publicity;
+    
     public static long getSerialVersionUID() {
         return serialVersionUID;
     }
@@ -117,6 +132,31 @@ public class PaperDetailUnitExp implements Serializable,Comparable<PaperDetailUn
 	public void setOptionOrder(String optionOrder) {
 		this.optionOrder = optionOrder;
 	}
+	
+	public String getFirstName() {
+		return firstName;
+	}
+
+	public void setFirstName(String firstName) {
+		this.firstName = firstName;
+	}
+
+	public String getSecondName() {
+		return secondName;
+	}
+
+	public void setSecondName(String secondName) {
+		this.secondName = secondName;
+	}
+
+	public String getPublicity() {
+		return publicity;
+	}
+
+	public void setPublicity(String publicity) {
+		this.publicity = publicity;
+	}
+
 	/**
 	 * 按照number排序
 	 * @param paperDetailUnitExp

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

@@ -230,6 +230,9 @@ public abstract class ExportPaperAbstractService {
 	//北京航空航天大学
 	protected static Template BJHK_TMPLATE_PAPER;
 	protected static Template BJHK_TMPLATE_ANSWER;
+	
+	//原卷word A4 模板
+	public static Template ORIGINAL_PAPER;
 
 	@Value("${upyun.bucketName}")
 	protected String bucketName;
@@ -321,6 +324,7 @@ public abstract class ExportPaperAbstractService {
 			BJHK_TMPLATE_PAPER = CONFIGURATION.getTemplate("bjhk_paper_template.ftl", ENCODING);
 			BJHK_TMPLATE_ANSWER = CONFIGURATION.getTemplate("bjhk_answer_template.ftl", ENCODING);
 			
+			ORIGINAL_PAPER = CONFIGURATION.getTemplate("original_paper.ftl", ENCODING);
 		} catch (Exception e) {
 			e.printStackTrace();
 		}

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

@@ -74,14 +74,14 @@ public class CoursePropertyServiceImpl implements CoursePropertyService{
 	}
 	
 	@Override
-	public void openCourseProperty(Long id, Long orgId) {
+	public void openCourseProperty(Long id) {
 		CourseProperty courseProperty = coursePropertyRepo.findOne(id);
 		courseProperty.setEnable(true);
 		coursePropertyRepo.save(courseProperty);
 	}
 
 	@Override
-	public void closeCourseProperty(Long id, Long orgId) {
+	public void closeCourseProperty(Long id) {
 		CourseProperty courseProperty = coursePropertyRepo.findOne(id);
 		courseProperty.setEnable(false);
 		coursePropertyRepo.save(courseProperty);
@@ -104,5 +104,35 @@ public class CoursePropertyServiceImpl implements CoursePropertyService{
 		List<CourseProperty> courseProperties = coursePropertyRepo.findByCourseCodeAndEnable(code, true);
 		return courseProperties;
 	}
+
+	@Override
+	public void opensCourseProperty(List<String> idList) {
+		List<Long> ids = new ArrayList<Long>();
+		if(idList != null && idList.size()>0){
+			for(String id:idList){
+				ids.add(Long.parseLong(id));
+			}
+		}
+		List<CourseProperty> courseProperties = coursePropertyRepo.findByIdIn(ids);
+		for(CourseProperty courseProperty:courseProperties){
+			courseProperty.setEnable(true);
+		}
+		coursePropertyRepo.save(courseProperties);
+	}
+
+	@Override
+	public void closesCourseProperty(List<String> idList) {
+		List<Long> ids = new ArrayList<Long>();
+		if(idList != null && idList.size()>0){
+			for(String id:idList){
+				ids.add(Long.parseLong(id));
+			}
+		}
+		List<CourseProperty> courseProperties = coursePropertyRepo.findByIdIn(ids);
+		for(CourseProperty courseProperty:courseProperties){
+			courseProperty.setEnable(false);
+		}
+		coursePropertyRepo.save(courseProperties);
+	}
 	
 }

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

@@ -7,7 +7,9 @@ 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.word.DocxProcessUtil;
 import cn.com.qmth.examcloud.core.questions.dao.CoursePropertyRepo;
+import cn.com.qmth.examcloud.core.questions.dao.PaperDetailUnitRepo;
 import cn.com.qmth.examcloud.core.questions.dao.PaperRepo;
+import cn.com.qmth.examcloud.core.questions.dao.QuesPkgPathRepo;
 import cn.com.qmth.examcloud.core.questions.dao.QuestionAudioRepo;
 import cn.com.qmth.examcloud.core.questions.dao.entity.*;
 import cn.com.qmth.examcloud.core.questions.dao.entity.computerTestModel.*;
@@ -15,12 +17,16 @@ import cn.com.qmth.examcloud.core.questions.service.ExportPaperService;
 import cn.com.qmth.examcloud.core.questions.service.PaperDetailService;
 import cn.com.qmth.examcloud.core.questions.service.PaperService;
 import cn.com.qmth.examcloud.core.questions.service.PropertyService;
+import cn.com.qmth.examcloud.core.questions.service.bean.dto.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 com.google.common.collect.Lists;
 import com.google.gson.Gson;
+
 import main.java.com.UpYun;
+
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -38,10 +44,12 @@ import org.springframework.data.mongodb.core.query.Query;
 import org.springframework.stereotype.Service;
 
 import javax.servlet.http.HttpServletResponse;
+
 import java.io.*;
 import java.util.*;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import java.util.stream.Collectors;
 
 
 @Service("exportPaperService")
@@ -50,6 +58,8 @@ public class ExportPaperServiceImpl implements ExportPaperService {
     public static final String TEMP_FILE_EXP = "docxExport/";
 
     public static final String TEMP_FILE_NAME = "_考试说明.docx";
+    
+	public static final String DOCX_SUFFIX = ".docx";
 
     @Autowired
     private PaperRepo paperRepo;
@@ -74,6 +84,12 @@ public class ExportPaperServiceImpl implements ExportPaperService {
 
     @Autowired
     private PrintExamPaperService printExamPaperService;
+    
+    @Autowired
+    private PaperDetailUnitRepo paperDetailUnitRepo;
+    
+    @Autowired
+	protected QuesPkgPathRepo quesPkgPathRepo;
 
     @Value("${upyun.bucketName}")
     protected String bucketName;
@@ -698,4 +714,48 @@ public class ExportPaperServiceImpl implements ExportPaperService {
         map.put(1l, 2l);
         System.out.println(map.get(1l));
     }
+
+	@Override
+	public void downOriginalPaper(String paperId, String loginName, HttpServletResponse response) throws Exception {
+		//生成导出的试卷对象
+		PaperExp paperExp = paperService.getDownPaperExp(paperId);
+		String zipFileName = loginName + System.currentTimeMillis() + "";
+	    File directory = new File(TEMP_FILE_EXP + File.separator + zipFileName);
+	    if (!directory.exists()) {
+	    	directory.mkdirs();
+	    }
+		String paperfileName = paperExp.getName()+"_"+paperExp.getCourseNo()+"_"+ExamFileType.PAPER.getName()+DOCX_SUFFIX;
+		File file = new File(TEMP_FILE_EXP+File.separator+zipFileName+File.separator+paperfileName);
+		List<WordprocessingMLPackage> wordPackages = getPkgList(paperId);
+		DocxProcessUtil.exportWordNew(paperExp, file,ExportPaperAbstractService.ORIGINAL_PAPER);
+		DocxProcessUtil.processImage(zipFileName+File.separator+paperfileName,wordPackages);
+		FileDisposeUtil.fileToZip(TEMP_FILE_EXP + File.separator + zipFileName, TEMP_FILE_EXP, zipFileName);
+        FileDisposeUtil.downloadFile(paperExp.getName() + "_" + paperExp.getCourse().getCode() + ".zip", TEMP_FILE_EXP + File.separator + zipFileName + ".zip", response);
+        deteleFolder(TEMP_FILE_EXP, zipFileName);
+	}
+	
+	/**
+     * 获取当前试卷下所有试题WordPkg
+     * @param id
+     * @return
+     */
+    protected List<WordprocessingMLPackage> getPkgList(String id){
+        Paper paper = paperRepo.findOne(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);
+	}
+	
 }

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

@@ -98,7 +98,7 @@ public class ExtractConfigProviderServiceImpl implements ExtractConfigProviderSe
 		ExtractConfig extractConfig = extractConfigService.findConfig(new ExtractConfig(examId,courseCode));
 		if(extractConfig == null){
 			log.error("该考试和课程下调卷规则未制定,请先制定调卷规则,调卷程序退出");
-			throw new StatusException("Q-020033","该考试和课程下调卷规则未制定,请先制定调卷规则,调卷程序退出");
+			throw new StatusException("Q-020101","该考试和课程下调卷规则未制定,请先制定调卷规则,调卷程序退出");
 		}
 		long configFinishTime = System.currentTimeMillis();
 		log.debug("获取调卷规则共耗时:"+ (configFinishTime - startTime)+"ms");
@@ -106,14 +106,14 @@ public class ExtractConfigProviderServiceImpl implements ExtractConfigProviderSe
 		Map<String,Paper> paperMap = this.getExamPaperByProbability(extractConfig.getExamPaperList());
 		if(paperMap.isEmpty()){
 			log.error("该考试和课程下调卷规则中试卷不存在,请检查调卷规则,调卷程序退出");
-			throw new StatusException("Q-020061","该考试和课程下调卷规则中试卷不存在,请重新制定调卷规则");
+			throw new StatusException("Q-020109","该考试和课程下调卷规则中试卷不存在,请重新制定调卷规则");
 		}
 		long paperMapFinishTime = System.currentTimeMillis();
 		log.debug("获取类型为"+ groupCode +"的试卷共耗时:"+ (paperMapFinishTime - configFinishTime)+"ms");
 		Paper basePaper = paperMap.get(groupCode);
 		if(basePaper==null){
 			log.error("该考试和课程下调卷规则中该类型试卷不存在,请检查调卷规则,调卷程序退出");
-			throw new StatusException("Q-020068","该考试和课程下调卷规则中试卷不存在,请重新制定调卷规则");
+			throw new StatusException("Q-020116","该考试和课程下调卷规则中试卷不存在,请重新制定调卷规则");
 		}
 		log.debug("将原始试卷:"+ basePaper.getId() +"根据规则重新组卷");
 		Short upSetQuestionOrder = extractConfig.getScrambling_the_question_order();
@@ -357,7 +357,9 @@ public class ExtractConfigProviderServiceImpl implements ExtractConfigProviderSe
 		log.debug("构建一个新的试题单元耗时:"+(newQuesTime - oldQuesTime)+"ms");
 		//替换试题单元中的音频路径
 		log.debug("给新的试题替换音频标签...");
-		appendAudioFlag(defaultQuestion,String.valueOf(examId),courseCode,groupCode,question);
+		if(examId != null){
+			appendAudioFlag(defaultQuestion,String.valueOf(examId),courseCode,groupCode,question);
+		}
 		long finishTime = System.currentTimeMillis();
 		log.debug("给新的试题替换音频标签耗时:"+(finishTime- newQuesTime)+"ms");
 		return defaultQuestion;
@@ -557,10 +559,25 @@ public class ExtractConfigProviderServiceImpl implements ExtractConfigProviderSe
 		Paper basePaper = paperRepo.findOne(paperId);
 		if(basePaper==null){
 			log.error("该考试和课程下调卷规则中该类型试卷不存在,请检查调卷规则,调卷程序退出");
-			throw new StatusException("Q-020068","该考试和课程下调卷规则中试卷不存在,请重新制定调卷规则");
+			throw new StatusException("Q-020560","该考试和课程下调卷规则中试卷不存在,请重新制定调卷规则");
 		}
 		//构建试卷结构
 		DefaultPaper defaultPaper = buildDefaultByBasePaper(basePaper,null,null,null);
 		return defaultPaper;
 	}
+
+	@Override
+	public Map<String, DefaultQuestion> getDefaultQuestions(Set<String> questionIds) {
+		Map<String, DefaultQuestion> map = new HashMap<String, DefaultQuestion>();
+		List<Question> questions = quesRepo.findByIdIn(questionIds);
+		if(questions == null && questions.size()>0){
+			log.error("根据试题id的集合没有查询到试题结合");
+			throw new StatusException("Q-020572","根据试题id的集合没有查询到试题结合");
+		}
+		for(Question question:questions){
+			DefaultQuestion defaultQuestion = getDefaultQuestion(null, null, null, question.getId());
+			map.put(question.getId(), defaultQuestion);
+		}
+		return map;
+	}
 }

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

@@ -26,6 +26,7 @@ import cn.com.qmth.examcloud.core.questions.service.bean.context.DetailContext;
 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 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;
@@ -133,8 +134,16 @@ public class GenPaperService {
     	long start4 = System.currentTimeMillis();
     	for(PaperDetailUnit oldUnit:oDetailUnits){
     		if(oldUnit.getPaper().getPaperType() == PaperType.IMPORT){
-    			oldUnit.getQuestion().setQuesName(oldUnit.getPaperDetail().getName());
-            	questions.add(oldUnit.getQuestion());
+    			Question question = oldUnit.getQuestion();
+    			if(question.getPublicity() == null){
+    				question.setPublicity(true);
+    			}
+    			if(StringUtils.isBlank(question.getDifficulty())){
+    				question.setDifficulty("中");
+    			}
+    			question.setQuesName(oldUnit.getPaperDetail().getName());
+    			question.setPropertyGroup(bulidGroup(question));
+            	questions.add(question);
     		}
         }
     	long total4 = (System.currentTimeMillis() - start4) / 1000;
@@ -209,53 +218,17 @@ public class GenPaperService {
     private boolean checkQuesType(UnitContext uc,Question question){
         List<String> quesNames = uc.getUnitStruct().getQuesNames();
         if(quesNames != null && quesNames.size() > 0){
-            if(quesNames.contains(question.getQuesName())
-                    && !uc.finish()
-                    && (uc.getUnitStruct().getQuestionType() == question.getQuestionType())){
-                return true;
+            if(quesNames.contains(question.getQuesName()) && !uc.finish() && (uc.getUnitStruct().getQuestionType() == question.getQuestionType())){
+            	if(question.getPropertyGroup() != null){
+            		if(question.getPropertyGroup().contains(uc.getUnitStruct().getPropertyGroup())){
+                    	return true;
+                    }
+            	}
             }
         }
         return false;
     }
 
-    /**
-     * 按分数在选定的试卷中随机抽取题,组成一套新的试卷
-     */
-    public Map<String, Object> genPaperByScoreG(GenPaperDto genPaperDto) {
-        String msg = "";
-        Map<String, Object> paperMsgMap = new HashMap<String, Object>();
-        Map<String, Double> paperMap = genPaperDto.getSimpleParams();
-        List<PaperDetailUnit> selectedUnits = new ArrayList<PaperDetailUnit>();// 选中的小题
-        if (paperMap != null && paperMap.size() > 0) {
-            for (String paperId : paperMap.keySet()) {
-                Double totalScore = paperMap.get(paperId);
-                List<PaperDetailUnit> unitList = unitRepo.findByPaperOrderByNumber(paperRepo.findOne(paperId));
-                Collections.shuffle(unitList);// 随机乱序之后再根据分数取题
-                double sum = 0;
-                for (PaperDetailUnit pdu : unitList) {
-                    sum += pdu.getScore();
-                    if (sum <= totalScore) {
-                        selectedUnits.add(pdu);
-                    } else {
-                        break;
-                    }
-                }
-            }
-        }
-        if (selectedUnits != null && selectedUnits.size() > 0) {
-            Paper paper = this.constuctPaper(selectedUnits, genPaperDto);
-            msg = "success";
-            paperMsgMap.put("paper", paper);
-            paperMsgMap.put("msg", msg);
-            return paperMsgMap;
-        } else {
-            msg = "没有搜索到相应的试题,请检查题源试卷是否有题目";
-            paperMsgMap.put("msg", msg);
-            return paperMsgMap;
-        }
-
-    }
-    
     /**
      * 按分数在选定的试卷中随机抽取题,组成一套新的试卷
      * @author 	weiwenhai
@@ -268,11 +241,24 @@ public class GenPaperService {
     	return paperMsgMap;
     }
     
+    //计算试题集合总分
+    private Double sum(List<PaperDetailUnit> unitList){
+    	Double sum = 0.0;
+    	if(unitList != null && unitList.size()>0){
+			for(PaperDetailUnit paperDetailUnit:unitList){
+				sum = sum + paperDetailUnit.getScore();
+			}
+			return sum;
+		}
+    	return sum;
+    }
+    
     //通过题目分数组卷
     private Map<String, Object> extractByQuestioScore(GenPaperDto genPaperDto,User user){
     	Map<String, Object> paperMsgMap = new HashMap<String, Object>();
-    	//获取所有试卷与抽题数
-    	Map<String, Double> paperMap = genPaperDto.getSimpleParams();
+    	//获取所有试卷与分数
+    	//Map<String, Double> paperMap = genPaperDto.getSimpleParams();
+    	Map<String, NumberDto> paperMap = genPaperDto.getSimpleParams();
     	if(paperMap != null && paperMap.size()>0){
     		//定义随机选中的小题集合
     		List<PaperDetailUnit> selectedUnits = new ArrayList<PaperDetailUnit>();
@@ -280,19 +266,15 @@ public class GenPaperService {
     		Map<String, List<PaperDetailUnit>> unitMap = sortUnitsByPaper(paperMap);
     		//随机抽题
     		for(String paperId : paperMap.keySet()){
+    			NumberDto numberDto = paperMap.get(paperId);
     			//随机抽取分数
-    			Double needScore = paperMap.get(paperId);
+    			Double needScore = numberDto.getCount();
     			//取到该试卷下所有小题
     			List<PaperDetailUnit> unitList = unitMap.get(paperId);
     			//试卷总分
-    			double sum = 0.0;
-    			if(unitList != null && unitList.size()>0){
-    				for(PaperDetailUnit paperDetailUnit:unitList){
-        				sum = sum + paperDetailUnit.getScore();
-        			}
-    			}
+    			double sum = sum(unitList);
+    			Paper paper = paperRepo.findOne(paperId);
     			if(sum < needScore.doubleValue() || needScore.doubleValue()==0){
-    				Paper paper = paperRepo.findOne(paperId);
     				if(needScore.doubleValue()==0){
     					paperMsgMap.put("msg", "\""+paper.getName()+"\"试卷,组卷分数不能为0");
                         return paperMsgMap;
@@ -300,12 +282,86 @@ public class GenPaperService {
     				paperMsgMap.put("msg", "\""+paper.getName()+"\"试卷,分数不够");
                     return paperMsgMap;
     			}
+    			//将所有试题按照 公开度  和  难度   进行分类
+    			Map<String, List<PaperDetailUnit>> paperUnitMap = sortUnitsByProperty(unitList);
+    			List<PaperDetailUnit> newDetailUnits = new ArrayList<PaperDetailUnit>();
+    			//获取公开简单数量
+    			if(numberDto.getPublicSimple()>0){
+    				Double needUnitScore = numberDto.getPublicSimple();
+    				List<PaperDetailUnit> units = paperUnitMap.get("true-易");
+    				//公开简单总分
+    				Double unitsScore = sum(units);
+    				if(units == null || needUnitScore > unitsScore){
+    					paperMsgMap.put("msg", "\""+ paper.getName()+"\"试卷,题源不够");
+                        return paperMsgMap;
+    				}
+    				newDetailUnits = commonScoreList(needUnitScore, units, newDetailUnits, genPaperDto.getCreator());
+    			}
+    			//获取公开中等数量
+    			if(numberDto.getPublicMedium()>0){
+    				Double needUnitScore = numberDto.getPublicMedium();
+    				List<PaperDetailUnit> units = paperUnitMap.get("true-中");
+    				//公开中等总分
+    				Double unitsScore = sum(units);
+    				if(units == null || needUnitScore > unitsScore){
+    					paperMsgMap.put("msg", "\""+ paper.getName()+"\"试卷,题源不够");
+                        return paperMsgMap;
+    				}
+    				newDetailUnits = commonScoreList(needUnitScore, units, newDetailUnits, genPaperDto.getCreator());
+    			}
+    			//获取公开困难数量
+    			if(numberDto.getPublicDifficulty()>0){
+    				Double needUnitScore = numberDto.getPublicDifficulty();
+    				List<PaperDetailUnit> units = paperUnitMap.get("true-难");
+    				//公开困难总分
+    				Double unitsScore = sum(units);
+    				if(units == null || needUnitScore > unitsScore){
+    					paperMsgMap.put("msg", "\""+ paper.getName()+"\"试卷,题源不够");
+                        return paperMsgMap;
+    				}
+    				newDetailUnits = commonScoreList(needUnitScore, units, newDetailUnits, genPaperDto.getCreator());
+    			}
+    			//获取非公开简单
+    			if(numberDto.getNoPublicSimple()>0){
+    				Double needUnitScore = numberDto.getNoPublicSimple();
+    				List<PaperDetailUnit> units = paperUnitMap.get("false-易");
+    				//非公开简单总分
+    				Double unitsScore = sum(units);
+    				if(units == null || needUnitScore > unitsScore){
+    					paperMsgMap.put("msg", "\""+ paper.getName()+"\"试卷,题源不够");
+                        return paperMsgMap;
+    				}
+    				newDetailUnits = commonScoreList(needUnitScore, units, newDetailUnits, genPaperDto.getCreator());
+    			}
+    			//获取非公开中等
+    			if(numberDto.getNoPublicMedium()>0){
+    				Double needUnitScore = numberDto.getNoPublicMedium();
+    				List<PaperDetailUnit> units = paperUnitMap.get("false-中");
+    				//非公开中等总分
+    				Double unitsScore = sum(units);
+    				if(units == null || needUnitScore > unitsScore){
+    					paperMsgMap.put("msg", "\""+ paper.getName()+"\"试卷,题源不够");
+                        return paperMsgMap;
+    				}
+    				newDetailUnits = commonScoreList(needUnitScore, units, newDetailUnits, genPaperDto.getCreator());
+    			}
+    			//获取非公开困难
+    			if(numberDto.getNoPublicDifficulty()>0){
+    				Double needUnitScore = numberDto.getNoPublicDifficulty();
+    				List<PaperDetailUnit> units = paperUnitMap.get("false-难");
+    				//非公开困难总分
+    				Double unitsScore = sum(units);
+    				if(units == null || needUnitScore > unitsScore){
+    					paperMsgMap.put("msg", "\""+ paper.getName()+"\"试卷,题源不够");
+                        return paperMsgMap;
+    				}
+    				newDetailUnits = commonScoreList(needUnitScore, units, newDetailUnits, genPaperDto.getCreator());
+    			}
     			//生成随机抽取的题号
-    			List<Integer> questionsIndex = new ArrayList<Integer>();
+    		  /*List<Integer> questionsIndex = new ArrayList<Integer>();
     			questionsIndex = CommonUtils.getRandom(questionsIndex, unitList.size(), unitList.size());
     			//定义随机抽题的数量
     			double lastScore = 0;
-    			List<PaperDetailUnit> newDetailUnits = new ArrayList<PaperDetailUnit>();
     			for(Integer index:questionsIndex){
     				PaperDetailUnit newUnit = unitList.get(index);
     				//如果抽题的数量大于所需的题量,跳出循环
@@ -318,7 +374,7 @@ public class GenPaperService {
 					newUnit.setCreateTime(CommonUtils.getCurDateTime());
 					newUnit.setPaperType(PaperType.GENERATE);
 					newDetailUnits.add(newUnit);
-    			}
+    			}*/
     			selectedUnits.addAll(newDetailUnits);
     		}
     		//把集合里面的小题按相同的大题分类
@@ -351,7 +407,8 @@ public class GenPaperService {
     private Map<String, Object> extractByQuestionNum(GenPaperDto genPaperDto,User user){
     	Map<String, Object> paperMsgMap = new HashMap<String, Object>();
     	//获取所有试卷与抽题数
-    	Map<String, Double> paperMap = genPaperDto.getSimpleParams();
+    	//Map<String, Double> paperMap = genPaperDto.getSimpleParams();
+    	Map<String, NumberDto> paperMap = genPaperDto.getSimpleParams();
     	if(paperMap != null && paperMap.size()>0){
     		//定义随机选中的小题集合
     		List<PaperDetailUnit> selectedUnits = new ArrayList<PaperDetailUnit>();
@@ -360,26 +417,87 @@ public class GenPaperService {
         	//随机抽题
     		for(String paperId : paperMap.keySet()){
     			//随机抽题数量
-    			Integer needNumber = Integer.valueOf(paperMap.get(paperId).intValue());
+    			//Integer needNumber = Integer.valueOf(paperMap.get(paperId).intValue());
+    			NumberDto numberDto = paperMap.get(paperId);
+    			Integer needNumber = Integer.valueOf(numberDto.getCount().intValue());
     			//取到该试卷下所有小题
     			List<PaperDetailUnit> unitList = unitMap.get(paperId);
     			//计算所有题目数量
     			int questionSum = countQuestions(unitList);
+    			Paper paper = paperRepo.findOne(paperId);
     			if(needNumber>questionSum){
-    				if(questionSum == 0){
-    					Paper paper = paperRepo.findOne(paperId);
-        				paperMsgMap.put("msg", "\""+ paper.getName()+"\"试卷,题源不够");
-    				}else {
-    					paperMsgMap.put("msg", "\""+unitList.get(0).getPaper().getName()+"\"试卷,题源不够");
-					}
+    				paperMsgMap.put("msg", "\""+ paper.getName()+"\"试卷,题源不够");
                     return paperMsgMap;
     			}
+    			//将所有试题按照 公开度  和  难度   进行分类
+    			Map<String, List<PaperDetailUnit>> paperUnitMap = sortUnitsByProperty(unitList);
+    			List<PaperDetailUnit> newDetailUnits = new ArrayList<PaperDetailUnit>();
+    			//获取公开简单数量
+    			if(numberDto.getPublicSimple()>0){
+    				Integer needUnits = Integer.valueOf(numberDto.getPublicSimple().intValue());
+    				List<PaperDetailUnit> units = paperUnitMap.get("true-易");
+    				if(units == null || needUnits > units.size()){
+    					paperMsgMap.put("msg", "\""+ paper.getName()+"\"试卷,题源不够");
+                        return paperMsgMap;
+    				}
+    				newDetailUnits = commonNumList(needUnits, units, newDetailUnits, genPaperDto.getCreator());
+    			}
+    			//获取公开中等数量
+    			if(numberDto.getPublicMedium()>0){
+    				Integer needUnits = Integer.valueOf(numberDto.getPublicMedium().intValue());
+    				List<PaperDetailUnit> units = paperUnitMap.get("true-中");
+    				if(units == null || needUnits > units.size()){
+    					paperMsgMap.put("msg", "\""+ paper.getName()+"\"试卷,题源不够");
+                        return paperMsgMap;
+    				}
+    				newDetailUnits = commonNumList(needUnits, units, newDetailUnits, genPaperDto.getCreator());
+    			}
+    			//获取公开困难数量
+    			if(numberDto.getPublicDifficulty()>0){
+    				Integer needUnits = Integer.valueOf(numberDto.getPublicDifficulty().intValue());
+    				List<PaperDetailUnit> units = paperUnitMap.get("true-难");
+    				if(units == null || needUnits > units.size()){
+    					paperMsgMap.put("msg", "\""+ paper.getName()+"\"试卷,题源不够");
+                        return paperMsgMap;
+    				}
+    				newDetailUnits = commonNumList(needUnits, units, newDetailUnits, genPaperDto.getCreator());
+    			}
+    			//获取非公开简单
+    			if(numberDto.getNoPublicSimple()>0){
+    				Integer needUnits = Integer.valueOf(numberDto.getNoPublicSimple().intValue());
+    				List<PaperDetailUnit> units = paperUnitMap.get("false-易");
+    				if(units == null || needUnits > units.size()){
+    					paperMsgMap.put("msg", "\""+ paper.getName()+"\"试卷,题源不够");
+                        return paperMsgMap;
+    				}
+    				newDetailUnits = commonNumList(needUnits, units, newDetailUnits, genPaperDto.getCreator());
+    			}
+    			//获取非公开中等
+    			if(numberDto.getNoPublicMedium()>0){
+    				Integer needUnits = Integer.valueOf(numberDto.getNoPublicMedium().intValue());
+    				List<PaperDetailUnit> units = paperUnitMap.get("false-中");
+    				if(units == null || needUnits > units.size()){
+    					paperMsgMap.put("msg", "\""+ paper.getName()+"\"试卷,题源不够");
+                        return paperMsgMap;
+    				}
+    				newDetailUnits = commonNumList(needUnits, units, newDetailUnits, genPaperDto.getCreator());
+    			}
+    			//获取非公开困难
+    			if(numberDto.getNoPublicDifficulty()>0){
+    				Integer needUnits = Integer.valueOf(numberDto.getNoPublicDifficulty().intValue());
+    				List<PaperDetailUnit> units = paperUnitMap.get("false-难");
+    				if(units == null || needUnits > units.size()){
+    					paperMsgMap.put("msg", "\""+ paper.getName()+"\"试卷,题源不够");
+                        return paperMsgMap;
+    				}
+    				newDetailUnits = commonNumList(needUnits, units, newDetailUnits, genPaperDto.getCreator());
+    			}
     			//生成随机抽取的题号
-    			List<Integer> questionsIndex = new ArrayList<Integer>();
-    			questionsIndex = CommonUtils.getRandom(questionsIndex, unitList.size(), unitList.size());
+    			/*List<Integer> questionsIndex = new ArrayList<Integer>();
+    			questionsIndex = CommonUtils.getRandom(questionsIndex, unitList.size(), unitList.size());*/
     			//定义随机抽题的数量
-    			int lastNumber = 0;
-    			List<PaperDetailUnit> newDetailUnits = new ArrayList<PaperDetailUnit>();
+    			/*int lastNumber = 0;
+    			
     			for(Integer index:questionsIndex){
     				PaperDetailUnit newUnit = unitList.get(index);
     				//如果抽题的数量大于所需的题量,跳出循环
@@ -398,7 +516,7 @@ public class GenPaperService {
 					newUnit.setCreateTime(CommonUtils.getCurDateTime());
 					newUnit.setPaperType(PaperType.GENERATE);
 					newDetailUnits.add(newUnit);
-    			}
+    			}*/
     			selectedUnits.addAll(newDetailUnits);
     		}
     		//把集合里面的小题按相同的大题分类
@@ -414,8 +532,67 @@ public class GenPaperService {
     	return paperMsgMap;
     }
     
+    /**
+     * 按数量公共抽题方法
+     * @param needUnits
+     * @param units
+     * @param newDetailUnits
+     * @param name
+     * @return
+     */
+    private List<PaperDetailUnit> commonNumList(Integer needUnits, List<PaperDetailUnit> units, List<PaperDetailUnit> newDetailUnits,String name){
+		Collections.shuffle(units);
+		int lastNumber = 0;
+		for(int index =0;index<needUnits;index++){
+			//如果抽题的数量大于所需的题量,跳出循环
+			if(lastNumber >= needUnits){
+				break;
+			}
+			PaperDetailUnit newUnit = units.get(index);
+			//如果是套题,取子题数量
+			if(units.get(index).getQuestion().getQuestionType() == QuesStructType.NESTED_ANSWER_QUESTION){
+				List<Question> subQuestions = newUnit.getQuestion().getSubQuestions();
+				lastNumber += subQuestions.size();
+			}else {
+				lastNumber += 1;
+			}
+			newUnit.setId(null);
+			newUnit.setCreator(name);
+			newUnit.setCreateTime(CommonUtils.getCurDateTime());
+			newUnit.setPaperType(PaperType.GENERATE);
+			newDetailUnits.add(newUnit);
+		}
+		return newDetailUnits;
+    }
+    
+    /**
+     * 按分数公共抽题方法
+     * @param needUnitScore
+     * @param units
+     * @param newDetailUnits
+     * @param name
+     * @return
+     */
+    private List<PaperDetailUnit> commonScoreList(Double needUnitScore,List<PaperDetailUnit> units,List<PaperDetailUnit> newDetailUnits,String name){
+    	Collections.shuffle(units);
+    	double sum = 0.0;
+    	for(PaperDetailUnit unit:units){
+    		if(sum >= needUnitScore){
+				break;
+			}
+    		PaperDetailUnit newUnit = unit;
+    		sum += newUnit.getScore();
+			newUnit.setId(null);
+			newUnit.setCreator(name);
+			newUnit.setCreateTime(CommonUtils.getCurDateTime());
+			newUnit.setPaperType(PaperType.GENERATE);
+			newDetailUnits.add(newUnit);
+    	}
+    	return newDetailUnits;
+    }
+    
     //将所有小题按questionId去重,并按试卷分类
-    private Map<String, List<PaperDetailUnit>> sortUnitsByPaper(Map<String, Double> paperMap){
+    private Map<String, List<PaperDetailUnit>> sortUnitsByPaper(Map<String, NumberDto> paperMap){
     	if(paperMap != null && paperMap.size()>0){
     		//所有小题集合
     		List<PaperDetailUnit> oldUnits = new ArrayList<PaperDetailUnit>();
@@ -445,6 +622,33 @@ public class GenPaperService {
     	return null;
     }
     
+    //将试卷下面的所有小题按照 公开度  和   难度  进行分类
+    private Map<String, List<PaperDetailUnit>> sortUnitsByProperty(List<PaperDetailUnit> units){
+    	Map<String, List<PaperDetailUnit>> map = new HashMap<String, List<PaperDetailUnit>>();
+    	if(units != null && units.size()>0){
+    		for(PaperDetailUnit unit:units){
+    			Question question = unit.getQuestion();
+    			if(question.getPublicity() == null){
+    				question.setPublicity(true);
+    			}
+    			if(StringUtils.isBlank(question.getDifficulty())){
+    				question.setDifficulty("中");
+    			}
+    			String key = question.getPublicity() + "-" + question.getDifficulty();
+    			List<PaperDetailUnit> units2 = null;
+    			if(map.get(key) != null && map.get(key).size()>0){
+    				units2 = map.get(key);
+    			}else {
+    				units2 = new ArrayList<PaperDetailUnit>();
+				}
+    			units2.add(unit);
+				map.put(key, units2);
+    		}
+    		return map;
+    	}
+    	return null;
+    }
+    
     //构建新的试卷
     private Paper buildPaper(Map<String, List<PaperDetailUnit>> map,GenPaperDto genPaperDto,List<PaperDetail> paperDetails){
     	Paper paper = this.constuctPaperByPaperDetails(paperDetails, genPaperDto);
@@ -550,88 +754,6 @@ public class GenPaperService {
 		return sum;
 	}
     
-    //gaoxing
-    public Map<String, Object> genPaperByQuestionNumG(GenPaperDto genPaperDto) {
-        String msg = "";
-        Map<String, Object> paperMsgMap = new HashMap<String, Object>();
-        Map<String, Double> paperMap = genPaperDto.getSimpleParams();
-        List<PaperDetailUnit> selectedUnits = new ArrayList<PaperDetailUnit>();// 选中的小题
-        if (paperMap != null && paperMap.size() > 0) {
-            for (String paperId : paperMap.keySet()) {
-                int needQuesNum = paperMap.get(paperId).intValue();// 需要抽取的试题数量
-                List<PaperDetailUnit> unitList = unitRepo.findByPaperOrderByNumber(paperRepo.findOne(paperId));
-                Collections.shuffle(unitList);// 随机乱序之后再取题
-                List<PaperDetailUnit> nestedUnits = new ArrayList<PaperDetailUnit>();// 已选的试题集合
-                List<Integer> otherQuesNum = new ArrayList<Integer>();
-                List<Integer> nestQums = new ArrayList<Integer>();
-                if (this.getTotalQuesNum(unitList) >= needQuesNum) {
-                    for (int i = 0; i < unitList.size(); i++) {
-                        PaperDetailUnit pdu = unitList.get(i);
-                        if (pdu.getQuestionType() == QuesStructType.NESTED_ANSWER_QUESTION) {
-                            if (pdu.getQuestion().getSubQuestions().size() <= needQuesNum) {
-                                nestQums.add(pdu.getQuestion().getSubQuestions().size());
-                                nestedUnits.add(pdu);
-                            }
-                        } else {
-                            otherQuesNum.add(1);
-                        }
-                    }
-                    List<Integer> canChooseNestNum = this.getNestNum(nestQums, otherQuesNum.size(), needQuesNum);
-                    int size = canChooseNestNum.size();
-                    int index = (int) (Math.random() * size);
-                    int ranmdomNum = canChooseNestNum.get(index);// 取第一个
-                    if (ranmdomNum == 0) {// 假如随机到0个套题
-                        selectedUnits.addAll(this.getNeedUnits(null, unitList, needQuesNum));
-                    } else {
-                        List<Integer> sumList = new ArrayList<Integer>();
-                        sumList = CombinationUtils.combiantion(nestQums, needQuesNum, ranmdomNum);
-                        selectedUnits.addAll(this.getNeedUnits(sumList, unitList, needQuesNum));//有套题情况
-                    }
-                } else {
-                    msg = "题源不足,请检查题源";
-                    paperMsgMap.put("msg", msg);
-                    return paperMsgMap;
-                }
-            }
-        }
-        Paper paper = this.constuctPaper(selectedUnits, genPaperDto);
-        msg = "success";
-        paperMsgMap.put("paper", paper);
-        paperMsgMap.put("msg", msg);
-        return paperMsgMap;
-    }
-
-	/**
-     * 构造大题
-     * 
-     * @param units
-     * @param number
-     * @param detailName
-     *            大题名称
-     * @return
-     */
-    public PaperDetail constuctPaperDeatil(List<PaperDetailUnit> units, int number, String detailName) {
-        PaperDetail pd = new PaperDetail();
-        if (units != null && units.size() > 0) {
-            Double score = 0d;
-            for (PaperDetailUnit pdu : units) {
-                score += pdu.getScore() == null ? 0 : pdu.getScore();
-
-            }
-            pd.setId(UUID.randomUUID().toString());
-            pd.setName(detailName);
-            pd.setUnitCount(units.size());
-            pd.setScore(score);
-            pd.setNumber(number);
-            pd.setCreateTime(CommonUtils.getCurDateTime());
-            for (PaperDetailUnit pdu : units) {
-                pdu.setPaperDetail(pd);
-            }
-        }
-        return pd;
-
-    }
-
     /**
      * 根据大题集合构造paper
      * 
@@ -664,46 +786,6 @@ public class GenPaperService {
 
     }
 
-    /**
-     * 随机构造试卷,根据小题类型 没有定义试卷结构
-     * 
-     * @param selectedUnits
-     * @param genPaperDto
-     * @return
-     */
-    public Paper constuctPaper(List<PaperDetailUnit> selectedUnits, GenPaperDto genPaperDto) {
-        Collections.sort(selectedUnits);// 根据大题题型ID排序
-        List<PaperDetailUnit> saveUnits = BeanCopierUtil.copyPropertiesOfList(selectedUnits, PaperDetailUnit.class);
-        List<QuesStructType> qsts = new ArrayList<QuesStructType>();
-        for (int i = 0; i < saveUnits.size(); i++) {
-            saveUnits.get(i).setId(UUID.randomUUID().toString());
-            if (!qsts.contains(saveUnits.get(i).getQuestionType())) {
-                qsts.add(saveUnits.get(i).getQuestionType());
-            }
-        }
-        Map<QuesStructType, List<PaperDetailUnit>> unitMap = new HashMap<QuesStructType, List<PaperDetailUnit>>();
-        Map<QuesStructType, Integer> qTypeIndexMap = new HashMap<QuesStructType, Integer>();
-        for (int i = 1; i <= qsts.size(); i++) {
-            List<PaperDetailUnit> tempUnits = new ArrayList<PaperDetailUnit>();
-            for (int j = 0; j < saveUnits.size(); j++) {
-                if (qsts.get(i - 1) == saveUnits.get(j).getQuestionType()) {
-                    tempUnits.add(saveUnits.get(j));
-                }
-            }
-            unitMap.put(qsts.get(i - 1), tempUnits);
-            qTypeIndexMap.put(qsts.get(i - 1), i);
-        }
-        List<PaperDetail> details = new ArrayList<PaperDetail>();
-        for (QuesStructType qType : unitMap.keySet()) {
-            details.add(this.constuctPaperDeatil(unitMap.get(qType), qTypeIndexMap.get(qType), qType.getName()));
-        }
-        Paper paper = this.constuctPaperByPaperDetails(details, genPaperDto);
-        paper.setUnitCount(this.getTotalQuesNum(saveUnits));// 设置小题数量,需统计subQuestion
-        paper = this.persistentPaper(PaperStructType.SIMPLE,saveUnits, details, paper);
-        return paper;
-
-    }
-
     /**
      * 数据入库
      * 
@@ -784,61 +866,6 @@ public class GenPaperService {
         return totalQuesNum + nestQuesNum;
     }
 
-    public List<PaperDetailUnit> getNeedUnits(List<Integer> sumList, List<PaperDetailUnit> unitList, int needQuesNum) {
-        List<PaperDetailUnit> selectedUnits = new ArrayList<PaperDetailUnit>();// 选中的小题
-        List<PaperDetailUnit> nestedUnits = new ArrayList<PaperDetailUnit>();// 套题集合
-        List<PaperDetailUnit> otherUnits = new ArrayList<PaperDetailUnit>();// 其他类型的小题
-        for (PaperDetailUnit pdu : unitList) {
-            if (pdu.getQuestionType() == QuesStructType.NESTED_ANSWER_QUESTION) {
-                nestedUnits.add(pdu);
-            } else {
-                otherUnits.add(pdu);
-            }
-        }
-        // 选的套题
-        if (sumList != null && sumList.size() > 0) {
-            for (Integer subNum : sumList) {
-                Iterator<PaperDetailUnit> ite = nestedUnits.iterator();
-                while (ite.hasNext()) {
-                    PaperDetailUnit pdu = ite.next();
-                    if (subNum == pdu.getQuestion().getSubQuestions().size()) {
-                        selectedUnits.add(pdu);
-                        ite.remove();
-                        break;
-                    }
-                }
-
-            }
-        }
-        int otherQuesNum = needQuesNum - this.getTotalQuesNum(selectedUnits);
-        for (int i = 0; i < otherQuesNum; i++) {
-            selectedUnits.add(otherUnits.get(i));
-        }
-        return selectedUnits;
-    }
-
-    public List<Integer> getNestNum(List<Integer> nestQums, int otherQuesNum, int needQuesNum) {
-        Collections.sort(nestQums);
-        List<Integer> chooseNestNum = new ArrayList<Integer>();
-        if (needQuesNum <= otherQuesNum) {
-            chooseNestNum.add(0);
-        }
-        for (int i = 1; i <= nestQums.size(); i++) {
-            int min = 0;
-            int max = 0;
-            for (int j = 0; j < i; j++) {
-                min += nestQums.get(j);
-                max += nestQums.get(nestQums.size() - 1 - j);
-            }
-            if ((max + otherQuesNum >= needQuesNum && needQuesNum - max <= otherQuesNum && needQuesNum - max >= 0)
-                    || (min + otherQuesNum >= needQuesNum && needQuesNum - min <= otherQuesNum
-                            && needQuesNum - min >= 0)) {
-                chooseNestNum.add(i);
-            }
-        }
-        return chooseNestNum;
-
-    }
 
     /**
      * 蓝图组卷,根据设定试卷结构组卷
@@ -948,6 +975,17 @@ public class GenPaperService {
         }
         return paperMsgMap;
     }
+    
+    /**
+     * 精确组卷试题筛选条件
+     * @param question
+     * @return
+     */
+    private List<String> bulidGroup(Question question){
+    	List<String> propertyGroups = new ArrayList<String>();
+    	propertyGroups.add(String.valueOf(question.getPublicity()) + "-" + question.getDifficulty());
+    	return propertyGroups;
+    }
 
     /**
      * 构建试题属性组合

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

@@ -5,7 +5,6 @@ import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.math.BigDecimal;
-import java.text.DecimalFormat;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Date;
@@ -22,6 +21,12 @@ import main.java.com.UpYun;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.docx4j.XmlUtils;
+import org.docx4j.jaxb.Context;
+import org.docx4j.wml.Body;
+import org.docx4j.wml.P;
+import org.docx4j.wml.R;
+import org.docx4j.wml.Text;
 import org.nlpcn.commons.lang.util.StringUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -42,10 +47,11 @@ import org.springframework.web.multipart.MultipartFile;
 
 import cn.com.qmth.examcloud.core.questions.base.print.CoursePaperDto;
 import cn.com.qmth.examcloud.core.questions.base.question.enums.QuesStructType;
+import cn.com.qmth.examcloud.core.questions.base.word.DocxProcessUtil;
 import cn.com.qmth.examcloud.commons.web.security.bean.User;
 
 import com.google.gson.Gson;
-import com.mysql.fabric.xmlrpc.base.Array;
+import com.netflix.infix.lang.infix.antlr.EventFilterParser.null_predicate_return;
 
 import cn.com.qmth.examcloud.core.questions.dao.ExamPaperRepo;
 import cn.com.qmth.examcloud.core.questions.dao.ExportServiceManageRepo;
@@ -64,6 +70,7 @@ import cn.com.qmth.examcloud.core.questions.dao.entity.Paper;
 import cn.com.qmth.examcloud.core.questions.dao.entity.PaperDetail;
 import cn.com.qmth.examcloud.core.questions.dao.entity.PaperDetailUnit;
 import cn.com.qmth.examcloud.core.questions.dao.entity.PaperSearchInfo;
+import cn.com.qmth.examcloud.core.questions.dao.entity.QuesProperty;
 import cn.com.qmth.examcloud.core.questions.service.rpc.PrintCoursePaperClient;
 import cn.com.qmth.examcloud.core.questions.service.ExtractConfigService;
 import cn.com.qmth.examcloud.core.questions.service.PaperDetailService;
@@ -188,6 +195,9 @@ public class PaperServiceImpl implements PaperService{
         if(StringUtils.isNotBlank(paperSearchInfo.getLevel())){
         	query.addCriteria(Criteria.where("course.level").is(paperSearchInfo.getLevel()));
         }
+        if(StringUtils.isNoneBlank(paperSearchInfo.getName())){
+        	query.addCriteria(Criteria.where("name").regex(".*?\\.*" +paperSearchInfo.getName() + ".*"));
+        }
         long count = this.mongoTemplate.count(query, Paper.class);
         query.with(new Sort(new Order(Direction.DESC,"createTime")));
         query.limit(pageSize);
@@ -591,7 +601,6 @@ public class PaperServiceImpl implements PaperService{
      * @param paperExp
      */
     public void initPaper(PaperExp paperExp) {
-    	DecimalFormat df = new DecimalFormat("#.00");
         if (paperExp.getPaperDetails() == null || paperExp.getPaperDetails().size() == 0) {
             return;
         }
@@ -1407,5 +1416,205 @@ public class PaperServiceImpl implements PaperService{
 		return newObjs;
 	}
 
+	@Override
+	public PaperExp getDownPaperExp(String paperId) throws Exception {
+		Paper paper = paperRepo.findOne(paperId);
+		// 创建paperDto
+        PaperExp paperExp = BeanCopierUtil.copyProperties(paper,PaperExp.class);
+        paperExp.setCourseName(paper.getCourse().getName());
+        paperExp.setCourseNo(paper.getCourse().getCode());
+        paperExp.setCourse(paper.getCourse());
+        // 获取大题
+        List<PaperDetail> paperDetails = paperDetailRepo.findByPaperOrderByNumber(paper);
+        List<PaperDetailExp> paperDetailExps = BeanCopierUtil.copyPropertiesOfList(paperDetails, PaperDetailExp.class);
+        // 封装小题
+        for (int i = 0; i < paperDetailExps.size(); i++) {
+            List<PaperDetailUnit> paperDetailUnits = paperDetailUnitRepo.findByPaperDetailOrderByNumber(paperDetails.get(i));
+            if (paperDetailUnits != null && paperDetailUnits.size() > 0) {
+                List<PaperDetailUnitExp> paperDetailUnitExps = BeanCopierUtil.copyPropertiesOfList(paperDetailUnits,PaperDetailUnitExp.class);
+                paperDetailExps.get(i).setPaperDetailUnits(paperDetailUnitExps);
+                paperDetailExps.get(i).setUnitCount(paperDetailUnitExps.size());
+            } else {
+                paperDetailExps.get(i).setUnitCount(0);
+            }
+        }
+        paperExp.setPaperDetails(paperDetailExps);
+        if (paperExp.getPaperDetails() == null || paperExp.getPaperDetails().size() == 0) {
+            return paperExp;
+        }
+        int mainNum = 0;
+        List<PaperDetailExp> paperDetailExpList = paperExp.getPaperDetails();
+        for (PaperDetailExp paperDetail : paperDetailExpList) {
+            // 大题序号
+            paperDetail.setNumber(++mainNum);
+            paperDetail.setCnNum(CommonUtils.toCHNum(paperDetail.getNumber()));
+            if (paperDetail != null && paperDetail.getPaperDetailUnits() != null&& paperDetail.getPaperDetailUnits().size() > 0) {
+            	int minNum = 1;
+                for (PaperDetailUnitExp paperDetailUnit : paperDetail.getPaperDetailUnits()) {
+                	Question question = paperDetailUnit.getQuestion();
+                	question.setDifficultyDegree(question.getDifficultyDegree() * 10);
+                	if(question.getPublicity() == null || question.getPublicity() == true){
+                		paperDetailUnit.setPublicity("公开");
+                	}else {
+                		paperDetailUnit.setPublicity("非公开");
+					}
+                	if(StringUtils.isBlank(paperDetail.getQuesType())){
+                		paperDetail.setQuesType(question.getQuestionType().getName());
+                	}
+                	//设置选项
+                	List<QuesOption> optionList = paperDetailUnit.getQuestion().getQuesOptions();
+                	if (optionList != null && optionList.size() > 0) {
+    					int index = 0;
+    					for (QuesOption quesOption : optionList) {
+    						quesOption.setOptionBodyWord(setOptionNum(quesOption.getOptionBodyWord(),getOptionNum(index)));
+    						index++;
+    					}
+    				}
+                	if(question.getQuestionType() != QuesStructType.NESTED_ANSWER_QUESTION){
+                		//给小题设置序号
+                		question.setQuesBodyWord(setSubQuesNum(question.getQuesBodyWord(), minNum++));
+                		question.setQuesAnswerWord(setAnswerNum(question.getQuesAnswerWord()));
+                		if(paperDetail.getFirstScore() == null){
+                			paperDetail.setFirstScore(question.getScore());
+                		}
+                	}else {
+                		List<Question> subQuesList = question.getSubQuestions();
+                        // 套题小题设置序号
+                        if (subQuesList != null && subQuesList.size() > 0) {
+                            int index = 1;
+                            for (Question subQues : subQuesList) {
+                            	subQues.setDifficultyDegree(subQues.getDifficultyDegree() * 10);
+                            	subQues.setQuesBodyWord(setSubQuesNum(subQues.getQuesBodyWord(), index++));
+                            	subQues.setQuesAnswerWord(setAnswerNum(subQues.getQuesAnswerWord()));
+                            	if(paperDetail.getFirstScore() == null){
+                        			paperDetail.setFirstScore(subQues.getScore());
+                        		}
+                            	List<QuesOption> subOptionList = subQues.getQuesOptions();
+        						if (subOptionList != null && subOptionList.size() > 0) {
+        							int sub_index = 0;
+        							for (QuesOption quesOption : subOptionList) {
+        								quesOption.setOptionBodyWord(setOptionNum(quesOption.getOptionBodyWord(),getOptionNum(sub_index)));
+        								sub_index++;
+        							}
+        						}
+                            }
+                        }
+					}
+                	List<QuesProperty> quesProperties = question.getQuesProperties();
+                	if(quesProperties != null && quesProperties.size()>0){
+                		QuesProperty quesProperty = quesProperties.get(0);
+                		paperDetailUnit.setFirstName(quesProperty.getFirstProperty().getName());
+                		paperDetailUnit.setSecondName(quesProperty.getSecondProperty().getName());
+                	}
+                }
+            }
+        }
+		return paperExp;
+	}
+	
+	/**
+     * 设置题号
+     * @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();
+    }
+    
+    /**
+   	 * 将数字1,2,3,4转化成A,B,C,D
+   	 * @param number
+   	 * @return
+   	 */
+    public String getOptionNum(int number){
+    	char optionNum = (char)(65 + number);
+	    return String.valueOf(optionNum);
+    }
+    
+    /**
+     * 设置选项号
+     * @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();
+    }
+
+    public String setAnswerNum(String quesBodyWordMl) throws Exception {
+        String tmpStr = DocxProcessUtil.BODY_HEADER + quesBodyWordMl + DocxProcessUtil.BODY_TAIL;
+        Body body = (Body)XmlUtils.unmarshalString(tmpStr,Context.jc,Body.class);
+        List<Object> pList = body.getContent();
+        int index = 0;
+        for(Object pObj:pList){
+            if(index > 0){
+                break;
+            }
+            P p = (P) pObj;
+            List<Object> pContent = p.getContent();
+            R run = new R();
+            Text text = new Text();
+            text.setValue("[答案]:");
+            run.getContent().add(text);
+            pContent.add(0,run);
+            index++;
+        }
+        StringBuffer pWordMl = new StringBuffer();
+        for(Object pObj:pList){
+            if(pObj instanceof P){
+                pWordMl.append(DocxProcessUtil.formatPWordMl(XmlUtils.marshaltoString(pObj)));
+            }
+        }
+        return pWordMl.toString();
+    }
 }