浏览代码

Merge remote-tracking branch 'origin/dev0410' into dev0410

宋悦 7 年之前
父节点
当前提交
a8ea11f2b0
共有 18 个文件被更改,包括 420 次插入244 次删除
  1. 62 0
      cqb-comm-utils/src/main/java/com/qmth/cqb/utils/CommonUtils.java
  2. 30 49
      cqb-comm-utils/src/main/java/com/qmth/cqb/utils/FileDisposeUtil.java
  3. 2 4
      cqb-comm-utils/src/main/java/com/qmth/cqb/utils/word/DocxProcessUtil.java
  4. 4 5
      cqb-gen-paper/src/main/java/com/qmth/cqb/genpaper/service/GenPaperService.java
  5. 2 3
      cqb-paper/src/main/java/com/qmth/cqb/paper/service/PaperService.java
  6. 3 18
      cqb-paper/src/main/java/com/qmth/cqb/paper/service/export/ExportPaperAbstractService.java
  7. 7 6
      cqb-paper/src/main/java/com/qmth/cqb/paper/service/impl/AudioTimeConfigServiceImpl.java
  8. 87 46
      cqb-paper/src/main/java/com/qmth/cqb/paper/service/impl/ExtractConfigFileServiceImpl.java
  9. 21 59
      cqb-paper/src/main/java/com/qmth/cqb/paper/service/impl/ExtractConfigServiceImpl.java
  10. 23 18
      cqb-paper/src/main/java/com/qmth/cqb/paper/service/impl/PaperServiceImpl.java
  11. 9 10
      cqb-paper/src/main/java/com/qmth/cqb/paper/web/PaperController.java
  12. 17 0
      cqb-question-resource/src/main/java/com/qmth/cqb/question/model/QuestionAudio.java
  13. 8 1
      cqb-question-resource/src/main/java/com/qmth/cqb/question/service/QuesService.java
  14. 7 0
      cqb-question-resource/src/main/java/com/qmth/cqb/question/service/QuestionAudioService.java
  15. 119 21
      cqb-question-resource/src/main/java/com/qmth/cqb/question/service/impl/QuesServiceImpl.java
  16. 8 0
      cqb-question-resource/src/main/java/com/qmth/cqb/question/service/impl/QuestionAudioServiceImpl.java
  17. 7 0
      cqb-question-resource/src/main/java/com/qmth/cqb/question/web/QuestionAudioController.java
  18. 4 4
      cqb-starter/src/test/java/com/qmth/cqb/ExtractConfigServiceTest.java

+ 62 - 0
cqb-comm-utils/src/main/java/com/qmth/cqb/utils/CommonUtils.java

@@ -9,8 +9,16 @@ import java.util.Date;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Properties;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 import java.util.stream.Stream;
 
+import org.dom4j.Attribute;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.DocumentHelper;
+import org.dom4j.Element;
+
 import cn.com.qmth.examcloud.common.dto.question.enums.QuesStructType;
 
 /**
@@ -191,6 +199,60 @@ public final class CommonUtils {
             return null;  
         } 
     }
+    
+    /**
+     * 从A标签中获取属性值
+     * 例如从:
+     * <a id=\"123456\" name=\"1_1_1.mp3\">
+     * 中获取id的属性值为:123456
+     * 获取name的属性值为:1_1_1.mp3
+     * @param questionStr
+     * @param attrName
+     * @return
+     */
+    public static String getAttrValue(String questionStr,String attrName){
+    	Pattern pattern = Pattern.compile("a.*");
+		Matcher matcher = pattern.matcher(questionStr);
+		while(matcher.find()){
+		      String result = matcher.group();
+		      String idstr = attrName+"=\".*?\"";
+		      Pattern pattern02 = Pattern.compile(idstr);
+		      Matcher matcher02 = pattern02.matcher(result);
+		      while(matcher02.find()){
+		    	  return matcher02.group().replaceAll(attrName+"=\"", "").replaceAll("\"", "");
+		      }
+		}
+		return "";
+    }
+    
+    /**
+     * 从一段HTML字符串中取出标签中的属性值
+     * @param htmlString
+     * @return
+     * @throws DocumentException
+     */
+    public static List<String> getAttrValueFromString(String htmlString,String flagName,String attrName){
+    	List<String> idValues = new ArrayList<String>();
+		try {
+			Document document = DocumentHelper.parseText(htmlString);
+			Element rootElement = document.getRootElement();
+			List<Element> nodes = new ArrayList<Element>();
+			if(flagName.equals(rootElement.getName())){
+				nodes.add(rootElement);
+			}else{
+				nodes = rootElement.elements(flagName);
+			}
+			for(Iterator<Element> itr = nodes.iterator();itr.hasNext();){
+				Element element = (Element) itr.next();
+				Attribute attr = element.attribute(attrName);  
+				idValues.add(attr.getValue());
+			}
+		} catch (DocumentException e) {
+			e.printStackTrace();
+		}
+		return idValues;
+    }
+    
 
     public static void main(String[] args) {
         // QuesStructType quesStructType = getEnum(QuesStructType.class,"单选");

+ 30 - 49
cqb-comm-utils/src/main/java/com/qmth/cqb/utils/FileDisposeUtil.java

@@ -21,6 +21,8 @@ import java.util.zip.ZipOutputStream;
 
 import javax.servlet.http.HttpServletResponse;
 
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.IOUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -175,7 +177,6 @@ public class FileDisposeUtil {
 		BufferedInputStream bis = null;
 		FileOutputStream fos = null;
 		ZipOutputStream zos = null;
-
 		if (sourceFile.exists() == false) {
 			logger.error("待压缩的文件目录:" + sourceFilePath + "不存在.");
 		} else {
@@ -192,55 +193,37 @@ public class FileDisposeUtil {
 						zos = new ZipOutputStream(new BufferedOutputStream(fos));
 						byte[] bufs = new byte[1024 * 10];
 						for (int i = 0; i < sourceFiles.length; i++) {
-							// 创建ZIP实体,并添加进压缩包
-							String fileEncode = System.getProperty("file.encoding");
-							String name = new String(sourceFiles[i].getName().getBytes(fileEncode),"UTF-8");
-							ZipEntry zipEntry = new ZipEntry(name);
-							zos.putNextEntry(zipEntry);
-							// 读取待压缩的文件并写进压缩包里
-							fis = new FileInputStream(sourceFiles[i]);
-							bis = new BufferedInputStream(fis, 1024 * 10);
-							int read = 0;
-							while ((read = bis.read(bufs, 0, 1024 * 10)) != -1) {
-								zos.write(bufs, 0, read);
+							try{
+								//创建ZIP实体,并添加进压缩包
+								String fileEncode = System.getProperty("file.encoding");
+								String name = new String(sourceFiles[i].getName().getBytes(fileEncode),"UTF-8");
+								ZipEntry zipEntry = new ZipEntry(name);
+								zos.putNextEntry(zipEntry);
+								//读取待压缩的文件并写进压缩包里
+								fis = new FileInputStream(sourceFiles[i]);
+								bis = new BufferedInputStream(fis, 1024 * 10);
+								int read = 0;
+								while ((read = bis.read(bufs, 0, 1024 * 10)) != -1) {
+									zos.write(bufs, 0, read);
+								}
+								zos.flush();
+							}catch(Exception e){
+								e.printStackTrace();
+							}finally{
+								IOUtils.closeQuietly(bis);
+								IOUtils.closeQuietly(fis);
 							}
-							zos.flush();
 						}
 						flag = true;
 					}
 				}
-				bis.close();
-				fis.close();
-				zos.close();
-				fos.close();
-			} catch (FileNotFoundException e) {
-				e.printStackTrace();
-				throw new RuntimeException(e);
-			} catch (IOException e) {
+			} catch (Exception e) {
 				e.printStackTrace();
-				throw new RuntimeException(e);
 			} finally {
-				try {
-					if (null != bis){
-						bis.close();
-						bis = null;
-					}
-					if (null != fis){
-						fis.close();
-						fis = null;
-					}
-					if (null != zos){
-						zos.close();
-						zos = null;
-					}
-					if (null != fos){
-						fos.close();
-						fos = null;
-					}
-				} catch (IOException e) {
-					e.printStackTrace();
-					throw new RuntimeException(e);
-				}
+				IOUtils.closeQuietly(bis);
+				IOUtils.closeQuietly(fis);
+				IOUtils.closeQuietly(zos);
+				IOUtils.closeQuietly(fos);
 			}
 		}
 		logger.info("压缩"+sourceFilePath+"目录完成");
@@ -249,13 +232,11 @@ public class FileDisposeUtil {
 	
 	public static void createDirectory(String downloadDirectory) {
 		File directory = new File(downloadDirectory);
-		if(directory.exists()){
-			File[] files = directory.listFiles();
-			for(File file:files){
-				file.delete();
-			}
+		if(!directory.exists()){
+			directory.mkdirs();
 		}else{
-			directory.mkdir();
+			FileUtils.deleteQuietly(directory);
+			directory.mkdirs();
 		}
 	}
 	

+ 2 - 4
cqb-comm-utils/src/main/java/com/qmth/cqb/utils/word/DocxProcessUtil.java

@@ -962,9 +962,7 @@ public final class DocxProcessUtil {
         }
     }
 
-    public static void main(String[] args) {
-        for(QuesUnit quesUnit:QuesUnit.values()){
-            System.out.println(quesUnit.name()+"  "+quesUnit.getName());
-        }
+    public static void main(String[] args) throws Exception {
+        System.out.println(formatPWordMl("<p>A</p>"));
     }
 }

+ 4 - 5
cqb-gen-paper/src/main/java/com/qmth/cqb/genpaper/service/GenPaperService.java

@@ -217,7 +217,6 @@ public class GenPaperService {
                                 nestQums.add(pdu.getQuestion().getSubQuestions().size());
                                 nestedUnits.add(pdu);
                             }
-
                         } else {
                             otherQuesNum.add(1);
                         }
@@ -327,7 +326,6 @@ public class GenPaperService {
             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>();
@@ -340,7 +338,6 @@ public class GenPaperService {
             }
             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()) {
@@ -367,8 +364,10 @@ public class GenPaperService {
             pd.setPaper(paper);
         }
         paperDetailRepo.save(details);
-        for (PaperDetailUnit pdu : selectedUnits) {
-            pdu.setPaper(paper);
+        for(int i = 0;i<selectedUnits.size();i++){
+        	PaperDetailUnit pdu = selectedUnits.get(i);
+        	pdu.setNumber(i+1);
+        	pdu.setPaper(paper);
         }
         unitRepo.save(selectedUnits);
         return paper;

+ 2 - 3
cqb-paper/src/main/java/com/qmth/cqb/paper/service/PaperService.java

@@ -197,7 +197,7 @@ public interface PaperService {
      */
     public List<String> getPaperNamesByQuestionId(String questionId);
     
-    public Page<Question> listQuestionforSelect(String paperId,int curPage,int pageSize,QuesStructType quesType,AccessUser accessUser);
+    public Page<Question> listQuestionforSelect(String paperId,int curPage,int pageSize,QuesStructType quesType,AccessUser accessUser,String quesBody);
 
     public Paper selectQuestionsToPaper(String paperId, String paperDetailId, List<Question> questions,
             AccessUser user);
@@ -206,8 +206,7 @@ public interface PaperService {
 
     public void checkPaperNameNew(String paperName, String orgId)throws Exception;
 
-    public Page<Paper> getImportPapersNotInIds(PaperSearchInfo paperSearchInfo, String[] ids, int curPage,
-            int pageSize);
+    public Page<Paper> getImportPapersNotInIds(PaperSearchInfo paperSearchInfo, String[] ids, int curPage,int pageSize);
     /**
      * 将选中的导入试卷复制为卷库试卷
      */

+ 3 - 18
cqb-paper/src/main/java/com/qmth/cqb/paper/service/export/ExportPaperAbstractService.java

@@ -702,7 +702,8 @@ public abstract class ExportPaperAbstractService {
 				if("audio".equals(block.getType())){
 					computerTestPaper.setHasVideo(1);
 					PaperDetailUnit paperDetailUnit = paperDetailUnitRepo.findById(computerTestQuestion.getId());
-					QuestionAudio audio = questionAudioService.findByQuestionIdAndFileName(paperDetailUnit.getQuestion().getId(),block.getValue());
+					QuestionAudio audio = questionAudioService.findAudioById(block.getValue());
+					block.setValue(block.getValue()+"."+audio.getFileSuffixes());
 					if(audio!=null){
 						AudioTimeConfig audioTime = new AudioTimeConfig();
 						audioTime.setCourseCode(computerTestPaper.getCourseCode());
@@ -730,7 +731,6 @@ public abstract class ExportPaperAbstractService {
     	List<ComputerTestPaper> computerTestPapers = new ArrayList<ComputerTestPaper>();
     	//循环得到试卷
     	for(ExamPaper examPaper:examPapers){
-    		
     		Paper paper = examPaper.getPaper();
     		//得到所有旧对象的大题对象
     		List<PaperDetail> paperDetails = paperService.findPaperDetailsById(paper.getId());
@@ -869,7 +869,7 @@ public abstract class ExportPaperAbstractService {
 					&&questionRowStrings[i].contains("name")){	//处理音频
 				questionRowStrings[i] = "<"+questionRowStrings[i]+">";
 				block.setType("audio");
-				block.setValue(getAudioName(questionRowStrings[i]));
+				block.setValue(CommonUtils.getAttrValue(questionRowStrings[i],"id"));
 				blocks.add(block);
 			}else{
 				block.setType("text");
@@ -901,21 +901,6 @@ public abstract class ExportPaperAbstractService {
         return list;
     }
 
-    private String getAudioName(String questionStr){
-    	Pattern pattern = Pattern.compile("a.*");
-		Matcher matcher = pattern.matcher(questionStr);
-		while(matcher.find()){
-		      String result = matcher.group();
-		      String idstr = "id=\".*?\"";
-		      Pattern pattern02 = Pattern.compile(idstr);
-		      Matcher matcher02 = pattern02.matcher(result);
-		      while(matcher02.find()){
-		    	  return matcher02.group().replaceAll("id=\"", "").replaceAll("\"", "");
-		      }
-		}
-		return "";
-    }
-    
 	/**
      * 生成试卷或答案Word,上传至又拍云
      * @param orgName

+ 7 - 6
cqb-paper/src/main/java/com/qmth/cqb/paper/service/impl/AudioTimeConfigServiceImpl.java

@@ -54,13 +54,14 @@ public class AudioTimeConfigServiceImpl implements AudioTimeConfigService{
 	
 	@Override
 	public void saveAudioTimeConfig(List<AudioTimeConfig> audioTimeConfigs,AccessUser user) {
-		this.deleteByExamIdAndCourseCode(audioTimeConfigs.get(0).getExamId(),audioTimeConfigs.get(0).getCourseCode());
-		
-		for(AudioTimeConfig audioTimeConfig:audioTimeConfigs){
-			audioTimeConfig.setCreateDate(new Date());
-			audioTimeConfig.setCreateUser(user.getName());
+		if(audioTimeConfigs!=null&&audioTimeConfigs.size()>0){
+			this.deleteByExamIdAndCourseCode(audioTimeConfigs.get(0).getExamId(),audioTimeConfigs.get(0).getCourseCode());
+			for(AudioTimeConfig audioTimeConfig:audioTimeConfigs){
+				audioTimeConfig.setCreateDate(new Date());
+				audioTimeConfig.setCreateUser(user.getName());
+			}
+			audioTimeConfigRepo.save(audioTimeConfigs);
 		}
-		audioTimeConfigRepo.save(audioTimeConfigs);
 	}
 
 	@Override

+ 87 - 46
cqb-paper/src/main/java/com/qmth/cqb/paper/service/impl/ExtractConfigFileServiceImpl.java

@@ -11,9 +11,6 @@ import java.util.Set;
 
 import javax.servlet.http.HttpServletResponse;
 
-
-
-
 import main.java.com.UpYun;
 
 import org.apache.commons.io.FileUtils;
@@ -50,8 +47,11 @@ import com.qmth.cqb.paper.service.ExportStructureService;
 import com.qmth.cqb.paper.service.ExtractConfigFileService;
 import com.qmth.cqb.paper.service.ExtractConfigService;
 import com.qmth.cqb.paper.service.export.ExportPaperAbstractService;
+import com.qmth.cqb.question.model.QuesOption;
+import com.qmth.cqb.question.model.Question;
 import com.qmth.cqb.question.model.QuestionAudio;
 import com.qmth.cqb.question.service.QuestionAudioService;
+import com.qmth.cqb.utils.CommonUtils;
 import com.qmth.cqb.utils.FileDisposeUtil;
 import com.qmth.cqb.utils.SpringContextUtils;
 import com.qmth.cqb.utils.enums.ExamFileType;
@@ -171,35 +171,18 @@ public class ExtractConfigFileServiceImpl implements ExtractConfigFileService {
 		FileDisposeUtil.createDirectory(downloadDirectory);
 		//创建压缩文件的文件夹
 		FileDisposeUtil.createDirectory(zipDirectory);
-		//如果是批量导出,首先检查该考试下的所有课程是否都制定了调卷规则
-		List<String> paperIds = new ArrayList<String>();
-		ExportStructure exportStructure = exportStructureService.findStructureByExamId(exportModel.getExamId()+"");
-		//如果是普通类型的批量导出,并且选择了导出试卷结构
-		if(exportModel.getExportContentList().contains(ExamFileType.PAPER_STRUCTURE_OBJECTIVE.name())
-				&&exportModel.getExportWay()==ExportWay.BATCH){
-			if(exportStructure!=null&&exportStructure.getExportType()==ExportType.NORMAL){
-				paperIds = checkAllCourseByExamId(exportModel.getExamId(),exportStructure.getExportType());
-				if(paperIds.size()>0){
-					//创建试卷结构Excel文件到downloadDirectory目录
-					makePaperStructure(exportStructure.getExamName(),paperIds,exportStructure);
-				}
-			}			
-		}
-		//如果是普通类型的单个导出
-		if(exportModel.getExportWay()==ExportWay.SINGLE){
-			if(exportStructure==null||exportStructure.getExportType()==ExportType.NORMAL){
-				paperIds = getFinishPaperIds(exportModel);
-			}
-		}
+		//得到所有锁定的试卷ID
+		List<String> paperIds = getFinishPaperIds(exportModel);
 		//根据条件获取到文件下载路径,下载文件到服务器的downloadDirectory文件夹
 		List<ExamFile> examFiles = examFileService.findExamFileListByExportPaperInfoModel(exportModel);
 		if(examFiles!=null&&examFiles.size()>0){
 			List<Paper> papers = paperRepo.findByIdIn(paperIds);
-			for(ExamFile examFile:examFiles){
+			for(int i = 0;i<examFiles.size();i++){
+				ExamFile examFile = examFiles.get(i);
 				UpYun upyun = new UpYun(bucketName,userName,password);
 				File file = new File(downloadDirectory+File.separator+examFile.getFileName());
 				upyun.readFile(examFile.getFilePath(), file);
-				downloadAudio(papers,examFile);
+				downloadAudio(papers.get(i),examFile);
 			}
 		}
 		//创建压缩文件名称
@@ -216,26 +199,21 @@ public class ExtractConfigFileServiceImpl implements ExtractConfigFileService {
 	/**
 	 * 下载试卷音频文件
 	 */
-	private void downloadAudio(List<Paper> papers,ExamFile examFile){
+	private void downloadAudio(Paper paper,ExamFile examFile){
 		if(examFile.getExamFileType()==ExamFileType.PAPER){
-			for(Paper paper:papers){
-				if(paper.getOrgId().equals(examFile.getOrgId())
-						&&paper.getCourse().getCode().equals(examFile.getCourseId())){
-					List<PaperDetailUnit> paperDetailUnits = paperDetailUnitRepo.findByPaperOrderByNumber(paper);
-					for(PaperDetailUnit unit:paperDetailUnits){
-						if(unit.getQuestion().getHasAudio()!=null&&unit.getQuestion().getHasAudio()){
-							String questionNumber = unit.getNumber()+"";
-							List<QuestionAudio> questionAudios = questionAudioService.findQuestionAudiosByQuestionId(unit.getQuestion().getId());
-							for(QuestionAudio audio:questionAudios){
-								//名称与题号保持一致
-								int index = audio.getFileName().indexOf("_");
-								String fileName = questionNumber+audio.getFileName().substring(index, audio.getFileName().length());
-								String audioFileName = examFile.getFileName().split("\\.")[0]+"_"+fileName;
-								UpYun upyun = new UpYun(bucketName,userName,password);
-								File file = new File(downloadDirectory+File.separator+audioFileName);
-								upyun.readFile(audio.getFileUrl(), file);
-								logger.info(audioFileName+"音频下载完成后返回");
-							}
+			if(paper.getOrgId().equals(examFile.getOrgId())
+					&&paper.getCourse().getCode().equals(examFile.getCourseId())){
+				List<PaperDetailUnit> paperDetailUnits = paperDetailUnitRepo.findByPaperOrderByNumber(paper);
+				for(PaperDetailUnit unit:paperDetailUnits){
+					if(unit.getQuestion().getHasAudio()!=null&&unit.getQuestion().getHasAudio()){
+						List<QuestionAudio> questionAudios = questionAudioService.findQuestionAudiosByQuestionId(unit.getQuestion().getId());
+						for(QuestionAudio audio:questionAudios){
+							String fileName = getAudioFileName(audio,unit);
+							String audioFileName = examFile.getFileName().split("\\.")[0]+"_"+fileName;
+							UpYun upyun = new UpYun(bucketName,userName,password);
+							File file = new File(downloadDirectory+File.separator+audioFileName);
+							upyun.readFile(audio.getFileUrl(), file);
+							logger.info(audioFileName+"音频下载完成后返回");
 						}
 					}
 				}
@@ -243,12 +221,76 @@ public class ExtractConfigFileServiceImpl implements ExtractConfigFileService {
 		}
 	}
 	
+	/**
+	 * 计算取得音频文件名称
+	 * @param audio
+	 * @param unit
+	 * @return
+	 */
+	private String getAudioFileName(QuestionAudio audio,PaperDetailUnit unit){
+		String questionAudioId = audio.getId();
+		StringBuffer audioFileName = new StringBuffer(unit.getNumber()+"_");
+		Question question = unit.getQuestion();
+		List<String> idvaluesBody = CommonUtils.getAttrValueFromString(question.getQuesBody(),"a","id");
+		if(idvaluesBody.contains(questionAudioId)){
+			audioFileName.append("1");//题干
+			audioFileName.append("_");
+			int index = idvaluesBody.indexOf(questionAudioId);
+			audioFileName.append(index+1);
+		}else{
+			List<QuesOption> options = question.getQuesOptions();
+			if(options!=null&&options.size()>0){
+				for(QuesOption option:options){
+					List<String> idvaluesOption = CommonUtils.getAttrValueFromString(option.getOptionBody(),"a","id");
+					if(idvaluesOption.contains(questionAudioId)){
+						audioFileName.append("2");//选项
+						audioFileName.append("_");
+						audioFileName.append(CommonUtils.getOptionNum(Integer.parseInt(option.getNumber())-1));
+						audioFileName.append("_");
+						int index = idvaluesOption.indexOf(questionAudioId);
+						audioFileName.append(index+1);
+						break;
+					}
+				}
+			}
+		}
+		audioFileName.append(".");
+		audioFileName.append(audio.getFileSuffixes());
+		return audioFileName.toString();
+	}
+	
 	/**
 	 * 得到调卷规则中已完成的试卷的ID集合
 	 * @param exportModel
 	 * @return
+	 * @throws Exception 
 	 */
-	private List<String> getFinishPaperIds(ExportPaperInfoModel exportModel) {
+	private List<String> getFinishPaperIds(ExportPaperInfoModel exportModel) throws Exception {
+		List<String> paperIds = new ArrayList<String>();
+		ExportStructure exportStructure = exportStructureService.findStructureByExamId(exportModel.getExamId()+"");
+		if(exportStructure==null){
+			exportStructure = new ExportStructure();
+			exportStructure.setExportType(ExportType.NORMAL);
+		}
+		//如果是普通类型的批量导出
+		if(exportModel.getExportWay()==ExportWay.BATCH){
+			paperIds = checkAllCourseByExamId(exportModel.getExamId(),exportStructure.getExportType());
+			if(exportStructure.getExportType()==ExportType.NORMAL){
+				if(paperIds.size()>0&&exportModel.getExportContentList().contains(ExamFileType.PAPER_STRUCTURE_OBJECTIVE.name())){
+					makePaperStructure(exportStructure.getExamName(),paperIds,exportStructure);
+				}
+			}
+		}
+		//如果是普通类型的单个导出
+		if(exportModel.getExportWay()==ExportWay.SINGLE){
+			if(exportStructure.getExportType()==ExportType.NORMAL){
+				paperIds = getSinglePaperFinishPaperIds(exportModel);
+			}
+		}
+		return paperIds;
+	}
+	
+	private List<String> getSinglePaperFinishPaperIds(ExportPaperInfoModel exportModel){
 		List<String> paperIds = new ArrayList<String>();
  		ExtractConfig condition = new ExtractConfig();
 		condition.setExamId(Long.parseLong(exportModel.getExamId()));
@@ -380,5 +422,4 @@ public class ExtractConfigFileServiceImpl implements ExtractConfigFileService {
     	logger.info("批量生成试卷结构完成");
 	}
 
-	
 }

+ 21 - 59
cqb-paper/src/main/java/com/qmth/cqb/paper/service/impl/ExtractConfigServiceImpl.java

@@ -9,7 +9,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Random;
 import java.util.Set;
-import java.util.Map.Entry;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -61,10 +60,11 @@ import com.qmth.cqb.paper.service.ExtractConfigService;
 import com.qmth.cqb.paper.service.PaperDetailUnitService;
 import com.qmth.cqb.paper.service.PaperService;
 import com.qmth.cqb.question.dao.QuesRepo;
-import com.qmth.cqb.question.dao.QuestionAudioRepo;
 import com.qmth.cqb.question.model.QuesOption;
 import com.qmth.cqb.question.model.Question;
 import com.qmth.cqb.question.model.QuestionAudio;
+import com.qmth.cqb.question.service.QuesService;
+import com.qmth.cqb.question.service.QuestionAudioService;
 import com.qmth.cqb.utils.BeanCopierUtil;
 import com.qmth.cqb.utils.CommonUtils;
 import com.qmth.cqb.utils.enums.PaperType;
@@ -102,11 +102,14 @@ public class ExtractConfigServiceImpl implements ExtractConfigService {
     @Autowired
     private PaperRepo paperRepo;
     
+    @Autowired
+    private QuesService quesService;
+    
     @Autowired
     private QuesRepo quesRepo;
     
     @Autowired
-    private QuestionAudioRepo questionAudioRepo;
+    private QuestionAudioService questionAudioService;
 
     @Autowired
     private MongoTemplate mongoTemplate;
@@ -141,6 +144,13 @@ public class ExtractConfigServiceImpl implements ExtractConfigService {
 
 	@Override
 	public Map<String, String> saveExtractConfig(ExtractConfig extractConfig,AccessUser accessUser) throws Exception {
+		List<ExamPaper> examPapers = extractConfig.getExamPaperList();
+		for(int i=0;i<examPapers.size();i++){
+			ExamPaper examPaper = examPapers.get(i);
+			Paper paper = examPaper.getPaper();
+			paper = paperRepo.findOne(paper.getId());
+			examPaper.setPaper(paper);
+		}
 		Course course = courseRepo.findFirstByCodeAndOrgId(extractConfig.getCourseCode(),extractConfig.getOrgId());
 		extractConfig.setCourse(course);
 		Map<String,String> newFinishedPaperIdMap = makePaperByConfig(extractConfig);
@@ -437,7 +447,7 @@ public class ExtractConfigServiceImpl implements ExtractConfigService {
         	//根据大题查出大题下面的小题
             List<PaperDetailUnit> paperDetailUnits = paperDetailUnitRepo.findByPaperDetailOrderByNumber(paperDetails.get(i));
 			//设置答案
-			setAnswer(paperDetailUnits);
+            setSelectQuestoionAnswer(paperDetailUnits);
             List<PaperDetailUnitDto> paperDetailUnitDtos = BeanCopierUtil.copyPropertiesOfList(paperDetailUnits,PaperDetailUnitDto.class);
             for (int j = 0; j < paperDetailUnitDtos.size(); j++) {
             	PaperDetailUnit paperDetailUnit = paperDetailUnits.get(j);
@@ -475,65 +485,18 @@ public class ExtractConfigServiceImpl implements ExtractConfigService {
 		return paperDto;
 	}
 	
-	private void setAnswer(List<PaperDetailUnit> paperDetailUnits) {
+	private void setSelectQuestoionAnswer(List<PaperDetailUnit> paperDetailUnits) {
 		for (PaperDetailUnit paperDetailUnit : paperDetailUnits) {
 			if(paperDetailUnit==null||paperDetailUnit.getQuestion()==null){
 				break;
 			}
 			String optionOrder = paperDetailUnit.getOptionOrder();
 			Question question = paperDetailUnit.getQuestion();
-			if (question.getQuestionType() == QuesStructType.SINGLE_ANSWER_QUESTION
-					|| question.getQuestionType() == QuesStructType.MULTIPLE_ANSWER_QUESTION) {
-				setAnswerUnit(question, optionOrder);
-			} else if (question.getQuestionType() == QuesStructType.NESTED_ANSWER_QUESTION) {
-				List<Question> subQuestions = question.getSubQuestions();
-				int index = 0;
-				for (int k = 0; k < subQuestions.size(); k++) {
-					Question subQuestion = subQuestions.get(k);
-					if (subQuestion.getQuestionType() == QuesStructType.SINGLE_ANSWER_QUESTION
-							|| subQuestion.getQuestionType() == QuesStructType.MULTIPLE_ANSWER_QUESTION) {
-						if(StringUtils.isNotEmpty(optionOrder) && optionOrder.contains(";")){
-							setAnswerUnit(subQuestion, optionOrder.split(";")[index]);
-						}else{
-							setAnswerUnit(subQuestion, "");								
-						}
-						index++;
-					}
-				}
-			}
-		}
-	}
-
-	private void setAnswerUnit(Question question,String optionOrder){
-		List<QuesOption> quesOptions = question.getQuesOptions();
-		if(quesOptions == null || quesOptions.size() == 0){
-			return;
-		}
-		if(StringUtils.isEmpty(optionOrder)){
-			int j = 0;
-			String answer = "";
-			for(QuesOption quesOption : quesOptions){
-				if(quesOption.getIsCorrect() == 1){
-					answer += CommonUtils.getOptionNum(j);
-				}
-				j++;
-			}
-			question.setQuesAnswer(answer);
-		}else{
-			String [] order = optionOrder.split(",");
-			String answer = "";
-			for(int i = 0;i < order.length;i++){
-				for(QuesOption quesOption : quesOptions){
-					if(order[i].equals(quesOption.getNumber()) && quesOption.getIsCorrect() == 1){
-						answer += CommonUtils.getOptionNum(i);
-						break;
-					}
-				}
-			}
-			question.setQuesAnswer(answer);
+			quesService.setSelectQuestionAnswer(question,optionOrder);
 		}
 	}
 	
+	
 	/**
 	 * 根据paperDetailUnitId抽取单个试题
 	 * 根据paperDetailUnitId中设置的option顺序对option排序
@@ -544,14 +507,13 @@ public class ExtractConfigServiceImpl implements ExtractConfigService {
         List<PaperDetailUnit> paperDetailUnits = new ArrayList<PaperDetailUnit>();
         paperDetailUnits.add(paperDetailUnit);
         //设置答案
-        setAnswer(paperDetailUnits);
+        setSelectQuestoionAnswer(paperDetailUnits);
         //重新对选择题option进行排序(多选、单选、套题下选择题)
         reorderChoicequestionOption(paperDetailUnit);
         Question ques = paperDetailUnit.getQuestion();
         QuestionDto dto = BeanCopierUtil.copyProperties(ques, QuestionDto.class);
-        
+        dto.setScore(paperDetailUnit.getScore());
         dto.setQuesOptions(buildQuestionOptionDto(ques.getQuesOptions()));
-        
         if (ques.getQuestionType() == QuesStructType.NESTED_ANSWER_QUESTION) {
             List<Question> subQuesList = ques.getSubQuestions();
             List<SubQuestionDto> subQuesDtos = BeanCopierUtil.copyPropertiesOfList(subQuesList, SubQuestionDto.class);
@@ -619,8 +581,8 @@ public class ExtractConfigServiceImpl implements ExtractConfigService {
 			for(int i = 0;i<bodyStrings.length;i++){
 				String containAStr = bodyStrings[i];
 				if(containAStr.indexOf("<a")>-1){
-					String fileName = matchAudioName(containAStr, "a", "id");
-					QuestionAudio questionAudio = questionAudioRepo.findByQuestionIdAndFileName(questionDto.getId(),fileName);
+					String questionAudioId = matchAudioName(containAStr, "a", "id");
+					QuestionAudio questionAudio = questionAudioService.findAudioById(questionAudioId);
 					String url = downloadUrl + questionAudio.getFileUrl();
 					if(questionDto.getPlayTime()!=null){
 						containAStr += " question-audio url=\""+url+"\" playTime=\""+questionDto.getPlayTime()+"\""+"></a>";

+ 23 - 18
cqb-paper/src/main/java/com/qmth/cqb/paper/service/impl/PaperServiceImpl.java

@@ -27,7 +27,6 @@ import org.springframework.data.domain.Example;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageImpl;
 import org.springframework.data.domain.PageRequest;
-import org.springframework.data.domain.Pageable;
 import org.springframework.data.domain.Sort;
 import org.springframework.data.domain.Sort.Direction;
 import org.springframework.data.domain.Sort.Order;
@@ -723,11 +722,9 @@ public class PaperServiceImpl implements PaperService{
     public Paper insertQuestionToPaper(String paperId, String paperDetailId, Question question, AccessUser user) {
     	Paper paper = paperRepo.findOne(paperId);
         question.setOrgId(user.getRootOrgId().toString());
-        quesService.updateQuesWord(question);
         question.setCourse(paper.getCourse());
         question.setCourseNo(paper.getCourse().getCode());//必须设置,因为部分方法需要courseNo作为查询条件
-        question.setCreateTime(CommonUtils.getCurDateTime());
-        question = quesRepo.save(question);
+        question = quesService.saveQues(question);
         
         PaperDetail paperDetail = paperDetailRepo.findOne(paperDetailId);
         PaperDetailUnit paperDetailUnit = new PaperDetailUnit(paper,paperDetail,question);
@@ -754,14 +751,14 @@ public class PaperServiceImpl implements PaperService{
 
     }
 
-    public Page<Question> listQuestionforSelect(String paperId,int curPage,int pageSize,QuesStructType quesType,AccessUser accessUser) {
+    public Page<Question> listQuestionforSelect(String paperId,int curPage,int pageSize,QuesStructType quesType,AccessUser accessUser,String quesBody) {
         Set<String> selectedIds = new HashSet<>();
         Paper paper = paperRepo.findOne(paperId);
         List<PaperDetailUnit> pdus = paperDetailUnitRepo.findByPaperOrderByNumber(paper);
         for (PaperDetailUnit pdu : pdus) {
             selectedIds.add(pdu.getQuestion().getId());
         }
-        return quesService.findByIdExclude(selectedIds, paper.getCourseNo(), quesType, curPage, pageSize,accessUser.getRootOrgId());
+        return quesService.findByIdExclude(selectedIds, paper.getCourseNo(), quesType, curPage, pageSize,accessUser.getRootOrgId(),quesBody);
     }
 
     public Paper selectQuestionsToPaper(String paperId, String paperDetailId, List<Question> questions,
@@ -824,15 +821,23 @@ public class PaperServiceImpl implements PaperService{
         }
     }
 
-    public Page<Paper> getImportPapersNotInIds(PaperSearchInfo paperSearchInfo, String[] ids, int curPage,
-            int pageSize) {
-        Set<String> selectedIds = new HashSet<>();
-        for (String id : ids) {
-            selectedIds.add(id);
-        }
-        Pageable page = new PageRequest(curPage - 1, pageSize);
-        return paperRepo.findByIdNotInAndCourseNoAndOrgIdAndPaperType(selectedIds, paperSearchInfo.getCourseNo(),
-                paperSearchInfo.getOrgId(), PaperType.IMPORT, page);
+    public Page<Paper> getImportPapersNotInIds(PaperSearchInfo paperSearchInfo, String[] ids, int curPage,int pageSize) {
+    	Set<String> selectedIds = new HashSet<>();
+    	for (String id : ids) {
+    	    selectedIds.add(id);
+    	}
+    	Query query = new Query();
+    	query.addCriteria(Criteria.where("paperType").is(PaperType.IMPORT));
+    	query.addCriteria(Criteria.where("orgId").is(paperSearchInfo.getOrgId()));
+    	query.addCriteria(Criteria.where("course.code").is(paperSearchInfo.getCourseNo()));
+    	query.addCriteria(Criteria.where("id").nin(selectedIds));
+    	long total = this.mongoTemplate.count(query, Paper.class);
+    	query.with(new Sort(new Order(Direction.DESC,"createTime")));
+    	query.limit(pageSize);
+    	query.skip((curPage - 1) * pageSize);
+    	List<Paper> paperList = this.mongoTemplate.find(query,Paper.class);
+    	Page<Paper> paperPageList = new PageImpl<Paper>(paperList,new PageRequest(curPage - 1, pageSize), total);
+    	return paperPageList;
     }
     /**
      * 将选中的导入试卷复制为卷库试卷
@@ -1081,7 +1086,7 @@ public class PaperServiceImpl implements PaperService{
 				String quesBody = question.getQuesBody();
 				if(!quesBody.contains(fileName)){
 					String quesBodyNew = quesBody.substring(0, quesBody.lastIndexOf("</p>")) 
-							+ "<a id=\"" + fileName + "\" name=\"" + fileName + "\"></a></p>";
+							+ "<a id=\"" + questionAudio.getId() + "\" name=\"" + fileName + "\"></a></p>";
 					question.setQuesBody(quesBodyNew);
 				}
 			}else {
@@ -1093,10 +1098,10 @@ public class PaperServiceImpl implements PaperService{
 						if(!optionBody.contains(fileName)){
 							String optionBodyNew = "";
 							if(StringUtils.isBlank(optionBody)){
-								optionBodyNew = "<p><a id=\""+fileName+"\" name=\""+fileName+"\"></a></p>";
+								optionBodyNew = "<p><a id=\""+questionAudio.getId()+"\" name=\""+fileName+"\"></a></p>";
 							}else{
 								optionBodyNew = optionBody.substring(0, optionBody.lastIndexOf("</p>")) 
-										+ "<a id=\""+fileName+"\" name=\""+fileName+"\"></a></p>";
+										+ "<a id=\""+questionAudio.getId()+"\" name=\""+fileName+"\"></a></p>";
 							}
 							quesOption.setOptionBody(optionBodyNew);
 						}

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

@@ -15,6 +15,7 @@ import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.domain.Example;
+import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageImpl;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
@@ -449,24 +450,22 @@ public class PaperController {
     @ApiOperation(value = "查询用于选题的试题列表", notes = "查询用于选题的试题列表")
     @Uac(roles={RoleMeta.QUESTION_ADMIN,RoleMeta.SUPER_ADMIN},policy=UacPolicy.IN)
     @GetMapping(value = "/paper/listQuestion/{paperId}/{curPage}/{pageSize}")
-    public ResponseEntity listQuestionforSelect(HttpServletRequest request,
+    public ResponseEntity<Object> listQuestionforSelect(HttpServletRequest request,
                                                 @PathVariable String paperId,
                                                 @PathVariable int curPage,
                                                 @PathVariable int pageSize,
-                                                @RequestParam(name = "quesType") String quesType) {
+                                                @RequestParam(name = "quesType") String quesType,
+                                                @RequestParam(name = "quesBody") String quesBody) {
         AccessUser accessUser = (AccessUser) request.getAttribute("accessUser");
         if(accessUser == null){
-            return new ResponseEntity(new PageImpl<Question>(new ArrayList<Question>()),HttpStatus.OK);
+            return new ResponseEntity<Object>(new PageImpl<Question>(new ArrayList<Question>()),HttpStatus.OK);
         }
+        QuesStructType quesStructType = null;
         if (StringUtils.isNotEmpty(quesType)) {
-            return new ResponseEntity(
-                    paperService.listQuestionforSelect(paperId, curPage, pageSize, QuesStructType.valueOf(quesType),accessUser),
-                    HttpStatus.OK);
-        } else {
-            return new ResponseEntity(paperService.listQuestionforSelect(paperId, curPage, pageSize, null,accessUser),
-                    HttpStatus.OK);
+        	quesStructType = QuesStructType.valueOf(quesType);
         }
-
+        Page<Question> questionPageList = paperService.listQuestionforSelect(paperId,curPage,pageSize,quesStructType,accessUser,quesBody);
+        return new ResponseEntity<Object>(questionPageList,HttpStatus.OK);
     }
 
     /**

+ 17 - 0
cqb-question-resource/src/main/java/com/qmth/cqb/question/model/QuestionAudio.java

@@ -3,6 +3,8 @@ package com.qmth.cqb.question.model;
 import java.io.Serializable;
 import java.util.Date;
 
+import org.apache.commons.lang3.StringUtils;
+
 /**
  * @author  	chenken
  * @date    	2017年8月1日 上午10:56:23
@@ -30,6 +32,10 @@ public class QuestionAudio implements Serializable{
 	 * 文件名称
 	 */
 	private String fileName;
+	/**
+	 * 文件后缀
+	 */
+	private String fileSuffixes;
 	/**
 	 * 存放路径
 	 */
@@ -48,6 +54,9 @@ public class QuestionAudio implements Serializable{
 	public QuestionAudio(String questionId,String fileName,String fileUrl){
 		this.questionId = questionId;
 		this.fileName = fileName;
+		if(StringUtils.isNotBlank(fileName)){
+			this.fileSuffixes = fileName.substring(fileName.indexOf(".")+1,fileName.length());
+		}
 		this.fileUrl = fileUrl;
 	}
 	
@@ -88,4 +97,12 @@ public class QuestionAudio implements Serializable{
 		this.createUser = createUser;
 	}
 
+	public String getFileSuffixes() {
+		return fileSuffixes;
+	}
+
+	public void setFileSuffixes(String fileSuffixes) {
+		this.fileSuffixes = fileSuffixes;
+	}
+	
 }

+ 8 - 1
cqb-question-resource/src/main/java/com/qmth/cqb/question/service/QuesService.java

@@ -59,7 +59,7 @@ public interface QuesService {
      * @param pageSize
      * @return
      */
-    public Page<Question> findByIdExclude(Set<String> idSet,String courseNo,QuesStructType quesType,int curPage,int pageSize,Long orgId);
+    public Page<Question> findByIdExclude(Set<String> idSet,String courseNo,QuesStructType quesType,int curPage,int pageSize,Long orgId,String quesBody);
 
     /**
      * 按ID获取试题
@@ -93,4 +93,11 @@ public interface QuesService {
      * @return
      */
     public String getExtractText(Question question);
+    /**
+     * 设置选择题答案
+     * @param question
+     * @param order
+     * @return
+     */
+    public void setSelectQuestionAnswer(Question question,String optionOrder);
 }

+ 7 - 0
cqb-question-resource/src/main/java/com/qmth/cqb/question/service/QuestionAudioService.java

@@ -14,6 +14,13 @@ import com.qmth.cqb.question.model.QuestionAudio;
  * @description QuestionRadioService.java
  */
 public interface QuestionAudioService {
+	
+	/**
+	 * 使用ID查询音频
+	 * @param id
+	 * @return
+	 */
+	public QuestionAudio findAudioById(String id);
 	/**
 	 * 保存试题音频文件记录
 	 * @param questionRadio

+ 119 - 21
cqb-question-resource/src/main/java/com/qmth/cqb/question/service/impl/QuesServiceImpl.java

@@ -2,16 +2,19 @@ package com.qmth.cqb.question.service.impl;
 
 import java.util.List;
 import java.util.Set;
+import java.util.regex.Pattern;
 
 import org.apache.commons.lang3.StringEscapeUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.docx4j.openpackaging.exceptions.InvalidFormatException;
 import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageImpl;
 import org.springframework.data.domain.PageRequest;
-import org.springframework.data.domain.Pageable;
 import org.springframework.data.domain.Sort;
+import org.springframework.data.domain.Sort.Direction;
+import org.springframework.data.domain.Sort.Order;
 import org.springframework.data.mongodb.core.MongoTemplate;
 import org.springframework.data.mongodb.core.query.Criteria;
 import org.springframework.data.mongodb.core.query.Query;
@@ -19,6 +22,7 @@ import org.springframework.stereotype.Service;
 
 import cn.com.qmth.examcloud.common.dto.question.enums.QuesStructType;
 
+import com.qmth.cqb.base.dao.CourseRepo;
 import com.qmth.cqb.question.dao.QuesRepo;
 import com.qmth.cqb.question.dao.QuestionAudioRepo;
 import com.qmth.cqb.question.model.QuesOption;
@@ -39,16 +43,30 @@ import com.qmth.cqb.utils.word.DocxProcessUtil;
 @Service("quesService")
 public class QuesServiceImpl implements QuesService{
 	@Autowired
-    QuesRepo quesRepo;
+	private QuesRepo quesRepo;
     
     @Autowired
-    QuestionAudioService questionAudioService;
+    private QuestionAudioService questionAudioService;
 
     @Autowired
-    MongoTemplate mongoTemplate;
+    private MongoTemplate mongoTemplate;
     
     @Autowired
-    QuestionAudioRepo questionAudioRepo;
+    private QuestionAudioRepo questionAudioRepo;
+    
+    @Autowired
+	private CourseRepo courseRepo;
+    
+    private static WordprocessingMLPackage wordMLPackage = null;
+    
+    static{
+    	try {
+			wordMLPackage = WordprocessingMLPackage.createPackage();
+		} catch (InvalidFormatException e) {
+			e.printStackTrace();
+		}
+    }
+    
     /**
      * 套题子题按序号自动生成ID
      *
@@ -133,6 +151,7 @@ public class QuesServiceImpl implements QuesService{
         } else {
         	question.setUpdateTime(now);
         }
+        setSelectQuestionAnswer(question,"");
         updateSubId(question);
         updateQuesWord(question);
         if(question.getHasAudio()!=null&&question.getHasAudio()){
@@ -226,20 +245,29 @@ public class QuesServiceImpl implements QuesService{
      * @param pageSize
      * @return
      */
-    public Page<Question> findByIdExclude(Set<String> idSet,
-                                          String courseNo,
-                                          QuesStructType quesType,
-                                          int curPage,
-                                          int pageSize,
-                                          Long orgId) {
-        Pageable page = new PageRequest(curPage - 1, pageSize);
-        Page<Question> list = quesType != null
-                ? quesRepo.findByIdNotInAndCourseNoAndQuestionTypeAndOrgId(idSet, courseNo, quesType, orgId.toString(),page)
-                : quesRepo.findByIdNotInAndCourseNoAndOrgId(idSet, courseNo,orgId.toString(),page);
-        for (Question question : list) {
+    public Page<Question> findByIdExclude(Set<String> idSet,String courseNo,QuesStructType quesType,int curPage,int pageSize,Long orgId,String quesBody) {
+        Query query = new Query();
+        if(quesType!=null){
+        	query.addCriteria(Criteria.where("questionType").is(quesType));
+        }
+        query.addCriteria(Criteria.where("orgId").is(orgId+""));
+        query.addCriteria(Criteria.where("course.code").is(courseNo));
+        query.addCriteria(Criteria.where("id").nin(idSet));
+        //模糊匹配
+        if(StringUtils.isNotBlank(quesBody)){
+        	Pattern pattern = Pattern.compile("^.*"+quesBody+".*$", Pattern.CASE_INSENSITIVE);
+            query.addCriteria(Criteria.where("quesBody").regex(pattern));
+        }
+        long total = this.mongoTemplate.count(query, Question.class);
+        query.with(new Sort(new Order(Direction.DESC,"id")));
+		query.limit(pageSize);
+        query.skip((curPage - 1) * pageSize);
+        List<Question> questionList = this.mongoTemplate.find(query,Question.class);
+        Page<Question> questionPageList = new PageImpl<Question>(questionList,new PageRequest(curPage - 1, pageSize), total);
+        for (Question question : questionPageList) {
             formatQues(question);
         }
-        return list;
+        return questionPageList;
     }
 
     /**
@@ -291,9 +319,10 @@ public class QuesServiceImpl implements QuesService{
      * @param question
      */
     public void updateQuesWord(Question question) {
-        WordprocessingMLPackage wordMLPackage = null;
         try {
-            wordMLPackage = WordprocessingMLPackage.createPackage();
+        	if(wordMLPackage==null){
+        		wordMLPackage = WordprocessingMLPackage.createPackage();
+        	}
             updateQuesWordUnit(wordMLPackage, question);
             List<Question> subQuesList = question.getSubQuestions();
             if (subQuesList != null && subQuesList.size() > 0) {
@@ -314,10 +343,15 @@ public class QuesServiceImpl implements QuesService{
             question.setQuesBodyWord(DocxProcessUtil.html2Docx(wordMLPackage, quesBody));
         }
         if(!StringUtils.isEmpty(quesAnswer)
-                && question.getQuestionType() == QuesStructType.FILL_BLANK_QUESTION
-                && question.getQuestionType() == QuesStructType.TEXT_ANSWER_QUESTION){
+                && (question.getQuestionType() == QuesStructType.FILL_BLANK_QUESTION
+                || question.getQuestionType() == QuesStructType.TEXT_ANSWER_QUESTION)){
             question.setQuesAnswerWord(DocxProcessUtil.html2Docx(wordMLPackage, quesAnswer));
         }
+        if(!StringUtils.isEmpty(quesAnswer)&& 
+        		(question.getQuestionType() == QuesStructType.SINGLE_ANSWER_QUESTION
+                ||question.getQuestionType() == QuesStructType.MULTIPLE_ANSWER_QUESTION)){
+        	question.setQuesAnswerWord(makeQuesAnswerWord(quesAnswer));
+        }
         List<QuesOption> quesOptions = question.getQuesOptions();
         if (quesOptions != null && quesOptions.size() > 0) {
             for (QuesOption quesOption : quesOptions) {
@@ -328,6 +362,19 @@ public class QuesServiceImpl implements QuesService{
         }
         question.setQuesPkg(DocxProcessUtil.getPkgByte(wordMLPackage));
     }
+    
+    private String makeQuesAnswerWord(String quesAnswer){
+    	String template = "<w:p xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" w:rsidR=\"00F65544\" w:rsidP=\"00F65544\" w:rsidRDefault=\"001738E2\">"+
+							    "<w:r w:rsidR=\"00F65544\">"+
+							        "<w:rPr>"+
+							            "<w:rFonts w:hint=\"eastAsia\"/>"+
+							            "<w:szCs w:val=\"21\"/>"+
+							        "</w:rPr>"+
+							        "<w:t>quesAnswer</w:t>"+
+							    "</w:r>"+
+							"</w:p>";
+    	return template.replace("quesAnswer", quesAnswer);
+    }
 
     /**
      * 获取试题有效文本
@@ -350,5 +397,56 @@ public class QuesServiceImpl implements QuesService{
         }
         return quesText.toString();
     }
+
+	@Override
+	public void setSelectQuestionAnswer(Question question, String optionOrder) {
+		if (question.getQuestionType() == QuesStructType.SINGLE_ANSWER_QUESTION
+				|| question.getQuestionType() == QuesStructType.MULTIPLE_ANSWER_QUESTION) {
+			question.setQuesAnswer(getSelectQuestionAnswer(question, optionOrder));
+		} else if (question.getQuestionType() == QuesStructType.NESTED_ANSWER_QUESTION) {
+			List<Question> subQuestions = question.getSubQuestions();
+			int index = 0;
+			for (int k = 0; k < subQuestions.size(); k++) {
+				Question subQuestion = subQuestions.get(k);
+				if (subQuestion.getQuestionType() == QuesStructType.SINGLE_ANSWER_QUESTION
+						|| subQuestion.getQuestionType() == QuesStructType.MULTIPLE_ANSWER_QUESTION) {
+					if(StringUtils.isNotEmpty(optionOrder) && optionOrder.contains(";")){
+						subQuestion.setQuesAnswer(getSelectQuestionAnswer(subQuestion, optionOrder.split(";")[index]));
+					}else{
+						subQuestion.setQuesAnswer(getSelectQuestionAnswer(subQuestion, ""));								
+					}
+					index++;
+				}
+			}
+		}
+	}
+
+	private String getSelectQuestionAnswer(Question question,String optionOrder){
+		String answer = "";
+		List<QuesOption> quesOptions = question.getQuesOptions();
+		if(quesOptions == null || quesOptions.size() == 0){
+			return "";
+		}
+		if(StringUtils.isEmpty(optionOrder)){
+			int j = 0;
+			for(QuesOption quesOption : quesOptions){
+				if(quesOption.getIsCorrect() == 1){
+					answer += CommonUtils.getOptionNum(j);
+				}
+				j++;
+			}
+		}else{
+			String [] order = optionOrder.split(",");
+			for(int i = 0;i < order.length;i++){
+				for(QuesOption quesOption : quesOptions){
+					if(order[i].equals(quesOption.getNumber()) && quesOption.getIsCorrect() == 1){
+						answer += CommonUtils.getOptionNum(i);
+						break;
+					}
+				}
+			}
+		}
+		return answer;
+	}
 }
 

+ 8 - 0
cqb-question-resource/src/main/java/com/qmth/cqb/question/service/impl/QuestionAudioServiceImpl.java

@@ -96,5 +96,13 @@ public class QuestionAudioServiceImpl implements QuestionAudioService{
 		}
 	}
 
+	@Override
+	public QuestionAudio findAudioById(String id) {
+		if(StringUtils.isNotBlank(id)){
+			return questionAudioRepo.findOne(id);
+		}
+		return null;
+	}
+
 }
 

+ 7 - 0
cqb-question-resource/src/main/java/com/qmth/cqb/question/web/QuestionAudioController.java

@@ -32,5 +32,12 @@ public class QuestionAudioController {
 		QuestionAudio questionAudio = questionAudioService.findByQuestionIdAndFileName(questionId, fileName);
 		return new ResponseEntity(questionAudio, HttpStatus.OK);
 	}
+	
+	@ApiOperation(value = "通过ID获取试题音频文件", notes = "通过ID获取试题音频文件")
+    @GetMapping(value = "/questionAudio/{questionAudioId}")
+	public ResponseEntity findQuestionAudioById(@PathVariable String questionAudioId){
+		QuestionAudio questionAudio = questionAudioService.findAudioById(questionAudioId);
+		return new ResponseEntity(questionAudio, HttpStatus.OK);
+	} 
 }
 

+ 4 - 4
cqb-starter/src/test/java/com/qmth/cqb/ExtractConfigServiceTest.java

@@ -151,10 +151,10 @@ public class ExtractConfigServiceTest {
 	}
 	@Test
 	public void testGetQuestionById(){
-		String examId = "117";
-		String paperDetailUnitId = "59ace6ec0fe2d25e666b1a08";
-		String courseCode = "000008";
-		String groupCode = "O";
+		String examId = "189";
+		String paperDetailUnitId = "59b8d7200fe2d22f92f48bdc";
+		String courseCode = "000001";
+		String groupCode = "A";
 		QuestionDto dto = extractConfigService.extractExamQuestion(examId,courseCode,groupCode,paperDetailUnitId);
 		System.out.println(dto.getQuesAnswer());
 	}