浏览代码

修改导入导出部分bug

宋悦 8 年之前
父节点
当前提交
117f64db6d

+ 1 - 1
cqb-comm-utils/src/main/java/com/qmth/cqb/utils/StringSimilarityUtils.java

@@ -88,7 +88,7 @@ public class StringSimilarityUtils {
 			}
 			similarity = sum / Math.sqrt(s1 * s2);
 		} else {
-			throw new NullPointerException("传入的参数为空");
+			return 0;
 		}
 		return similarity;
 	}

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

@@ -670,8 +670,6 @@ public final class DocxProcessUtil {
 
         for (WordprocessingMLPackage wp : wordMLPackages) {
 
-            //初始化图片路径
-            initPkgImage(wp);
             // 获取资源文件存储
             PartStore partStore = wp.getSourcePartStore();
             // 获取图片资源定义
@@ -812,11 +810,11 @@ public final class DocxProcessUtil {
             wordMl += XmlUtils.marshaltoString(p);
         }
 //            wordMl = formatPWordMl(wordMl);
+        initPkgImage(wordMLPackage);
         return wordMl;
     }
 
     public static void main(String[] args) {
-        String str = "1";
-        System.out.println(str.matches("^\\d{1,}\\.[\\s\\S]*"));
+        System.out.println("123".matches("^\\d{1,}$"));
     }
 }

+ 68 - 3
cqb-paper/src/main/java/com/qmth/cqb/paper/service/ExportPaperService.java

@@ -17,6 +17,7 @@ import com.qmth.cqb.utils.BeanCopierUtil;
 import com.qmth.cqb.utils.CommonUtils;
 import com.qmth.cqb.utils.exception.PaperException;
 import com.qmth.cqb.utils.word.DocxProcessUtil;
+import org.apache.commons.lang3.StringUtils;
 import org.docx4j.XmlUtils;
 import org.docx4j.jaxb.Context;
 import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
@@ -26,6 +27,7 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 import javax.servlet.http.HttpServletResponse;
+import javax.xml.bind.JAXBElement;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
@@ -172,10 +174,16 @@ public class ExportPaperService {
                     }
                 }
                 List<Question> subQuesList = paperDetailUnit.getQuestion().getSubQuestions();
+                Question question = paperDetailUnit.getQuestion();
                 //套题序号
                 if(subQuesList != null && subQuesList.size() > 0){
+
+                    question.setQuesBodyWord(replaceQuesBlank(question.getQuesBodyWord(),subNum + 1));
+
                     for(Question subQues:subQuesList){
-                        subQues.setQuesBodyWord(setSubQuesNum(subQues.getQuesBodyWord(),++subNum));
+                        int curSubNum = ++subNum;
+                        subQues.setQuesBodyWord(setSubQuesNum(subQues.getQuesBodyWord(),curSubNum));
+                        subQues.setQuesBodyWord(replaceQuesBlank(subQues.getQuesBodyWord(),curSubNum));
                         List<QuesOption> subOptionList = subQues.getQuesOptions();
                         if(subOptionList != null && subOptionList.size() > 0){
                             int sub_index = 0;
@@ -186,8 +194,9 @@ public class ExportPaperService {
                         }
                     }
                 }else{
-                    Question question = paperDetailUnit.getQuestion();
-                    question.setQuesBodyWord(setSubQuesNum(question.getQuesBodyWord(),++subNum));
+                    int curSubNum = ++subNum;
+                    question.setQuesBodyWord(setSubQuesNum(question.getQuesBodyWord(),curSubNum));
+                    question.setQuesBodyWord(replaceQuesBlank(question.getQuesBodyWord(),curSubNum));
                 }
             }
         }
@@ -253,4 +262,60 @@ public class ExportPaperService {
         return DocxProcessUtil.formatPWordMl(XmlUtils.marshaltoString(p));
     }
 
+    /**
+     * 替换填空
+     * @param wordMl
+     * @param num
+     * @return
+     * @throws Exception
+     */
+    public String replaceQuesBlank(String wordMl,int num) throws Exception {
+        String tmpStr = DocxProcessUtil.BODY_HEADER + wordMl + DocxProcessUtil.BODY_TAIL;
+        Body body = (Body)XmlUtils.unmarshalString(tmpStr,
+                Context.jc,Body.class);
+        List<Object> pList = body.getContent();
+        int index = 0;
+        int cur = 0;
+        Map<Integer,String> curMap = new HashMap<Integer,String>();
+        for(Object pObj:pList){
+            if(pObj.getClass().equals(P.class)){
+                List<Object> pContent = ((P)pObj).getContent();
+                for(Object rObj:pContent){
+                    if(rObj.getClass().equals(R.class)){
+                        List<Object> rContent = ((R)rObj).getContent();
+                        for(Object tObj:rContent){
+                            if (tObj instanceof JAXBElement)
+                                tObj = ((JAXBElement<?>) tObj).getValue();
+                            if(tObj.getClass().equals(Text.class)){
+                                Text text = (Text)tObj;
+                                String str = text.getValue();
+                                if(str.equals("###")){
+                                    text.setValue("______");
+                                }else if(str.startsWith("#") || str.equals("___")){
+                                    curMap.put(cur,str);
+                                    text.setValue("");
+                                }else if(str.matches("^\\d{1,}$")){
+                                    String preStr = curMap.get(cur - 1);
+                                    if(!StringUtils.isEmpty(preStr) && preStr.startsWith("#")){
+                                        int curNum = num + index;
+                                        text.setValue("___"+(curNum)+"___");
+                                        index++;
+                                    }
+                                }
+                                cur++;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        StringBuffer pWordMl = new StringBuffer();
+        for(Object pObj:pList){
+            if(pObj instanceof P){
+                pWordMl.append(DocxProcessUtil.formatPWordMl(XmlUtils.marshaltoString(pObj)));
+            }
+        }
+        return pWordMl.toString();
+    }
+
 }

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

@@ -434,7 +434,7 @@ public class PaperService {
                                 subQues.setQuesParams(params);
                                 quesService.formatQuesUnit(subQues);
                             }
-                            String quesBodyHtml = relaceRuestionIdx(paperDetailUnit.getQuestion().getQuesBody(), index);
+                            String quesBodyHtml = relaceQuestionIdx(paperDetailUnit.getQuestion().getQuesBody(), index);
                             paperDetailUnit.getQuestion().setQuesBody(quesBodyHtml);
                         } else {
                             paperDetailUnit.setNumber(++subNum);
@@ -669,7 +669,7 @@ public class PaperService {
 
     }
 
-    private String relaceRuestionIdx(String str, int baseIdx) {
+    private String relaceQuestionIdx(String str, int baseIdx) {
         StringBuffer sb = new StringBuffer("");
         Pattern pattern = Pattern.compile("##(\\d+)##");
 

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

@@ -342,12 +342,18 @@ public class PaperController {
 
         int length = allPaperDetailUnitList.size();
         for (int i = 0; i < length - 1; i++) {
+            PaperDetailUnitExp paperDetailUnitExp1 = allPaperDetailUnitList.get(i);
+            String quesText1 = quesService.getExtractText(paperDetailUnitExp1.getQuestion());
+            if(StringUtils.isEmpty(quesText1)){
+                continue;
+            }
             for (int j = i + 1; j < length; j++) {
-                PaperDetailUnitExp paperDetailUnitExp1 = allPaperDetailUnitList.get(i);
                 PaperDetailUnitExp paperDetailUnitExp2 = allPaperDetailUnitList.get(j);
-                double similarity = StringSimilarityUtils.getSimilarityWithCosinesBySeg(
-                        quesService.getExtractText(paperDetailUnitExp1.getQuestion()),
-                        quesService.getExtractText(paperDetailUnitExp2.getQuestion()));
+                String quesText2 = quesService.getExtractText(paperDetailUnitExp2.getQuestion());
+                if(StringUtils.isEmpty(quesText2)){
+                    continue;
+                }
+                double similarity = StringSimilarityUtils.getSimilarityWithCosinesBySeg(quesText1,quesText2);
                 if (similarity > reduplicateSimilarity) {
                     boolean found = false;
                     for (int k = 0; k < reduplicateId.size(); k++) {

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

@@ -293,7 +293,6 @@ public class QuesService {
                         StringEscapeUtils.unescapeHtml4(quesOption.getOptionBody())));
             }
         }
-        DocxProcessUtil.initPkgImage(wordMLPackage);
         question.setQuesPkg(DocxProcessUtil.getPkgByte(wordMLPackage));
     }
 
@@ -305,11 +304,15 @@ public class QuesService {
      */
     public String getExtractText(Question question) {
         StringBuilder quesText = new StringBuilder();
-        quesText.append(DocxProcessUtil.getTextInHtml(question.getQuesBody()));
+        if(!StringUtils.isEmpty(question.getQuesBody())){
+            quesText.append(DocxProcessUtil.getTextInHtml(question.getQuesBody()));
+        }
         List<QuesOption> quesOptionList = question.getQuesOptions();
         if (quesOptionList != null && quesOptionList.size() > 0) {
             for (QuesOption quesOption : quesOptionList) {
-                quesText.append(DocxProcessUtil.getTextInHtml(quesOption.getOptionBody()));
+                if(!StringUtils.isEmpty(quesOption.getOptionBody())){
+                    quesText.append(DocxProcessUtil.getTextInHtml(quesOption.getOptionBody()));
+                }
             }
         }
         return quesText.toString();