Browse Source

提交题库BUG

chenken 7 years ago
parent
commit
823709d915

+ 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>"));
     }
 }

+ 9 - 52
cqb-paper/src/main/java/com/qmth/cqb/paper/service/impl/ExtractConfigServiceImpl.java

@@ -63,6 +63,7 @@ import com.qmth.cqb.question.dao.QuesRepo;
 import com.qmth.cqb.question.model.QuesOption;
 import com.qmth.cqb.question.model.Question;
 import com.qmth.cqb.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;
@@ -101,6 +102,9 @@ public class ExtractConfigServiceImpl implements ExtractConfigService {
     @Autowired
     private PaperRepo paperRepo;
     
+    @Autowired
+    private QuesService quesService;
+    
     @Autowired
     private QuesRepo quesRepo;
     
@@ -443,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);
@@ -481,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排序
@@ -550,7 +507,7 @@ 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();

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

@@ -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);
 }

+ 87 - 4
cqb-question-resource/src/main/java/com/qmth/cqb/question/service/impl/QuesServiceImpl.java

@@ -5,6 +5,7 @@ import java.util.Set;
 
 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;
@@ -54,6 +55,17 @@ public class QuesServiceImpl implements QuesService{
     
     @Autowired
 	private CourseRepo courseRepo;
+    
+    private static WordprocessingMLPackage wordMLPackage = null;
+    
+    static{
+    	try {
+			wordMLPackage = WordprocessingMLPackage.createPackage();
+		} catch (InvalidFormatException e) {
+			e.printStackTrace();
+		}
+    }
+    
     /**
      * 套题子题按序号自动生成ID
      *
@@ -138,6 +150,7 @@ public class QuesServiceImpl implements QuesService{
         } else {
         	question.setUpdateTime(now);
         }
+        setSelectQuestionAnswer(question,"");
         updateSubId(question);
         updateQuesWord(question);
         if(question.getHasAudio()!=null&&question.getHasAudio()){
@@ -300,9 +313,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) {
@@ -323,10 +337,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) {
@@ -337,6 +356,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);
+    }
 
     /**
      * 获取试题有效文本
@@ -359,5 +391,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;
+	}
 }