Kaynağa Gözat

提交通用题库BUG

chenken 7 yıl önce
ebeveyn
işleme
980e7da967

+ 68 - 9
cqb-comm-utils/src/main/java/com/qmth/cqb/utils/word/DocxProcessUtil.java

@@ -65,7 +65,9 @@ import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileInputStream;
+import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
+import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.OutputStreamWriter;
@@ -701,30 +703,31 @@ public final class DocxProcessUtil {
     	logger.info("试卷:“"+fileName+"”导出处理图片开始...");
         String filePath = TEMP_FILE_EXP + fileName;
         InputStream mainFile = new FileInputStream(filePath);
-        // 以单个wordXml方式解析freemarker导出的文件
+        // 取到当前生成的主Word
         FlatOpcXmlImporter flatOpcXmlImporter = new FlatOpcXmlImporter(mainFile);
         WordprocessingMLPackage wordMLPackage = (WordprocessingMLPackage) flatOpcXmlImporter.get();
+        //构建relationships
         RelationshipsPart relationshipsPart = wordMLPackage.getMainDocumentPart().getRelationshipsPart();
-
         for (WordprocessingMLPackage wp : wordMLPackages) {
         	if(wp==null){
         		continue;
         	}
             // 获取资源文件存储
             ZipPartStore partStore = (ZipPartStore) wp.getSourcePartStore();
-            // 获取图片资源定义
+            // 获取图片资源定义、只取图片
             RelationshipsPart rp = wp.getMainDocumentPart().getRelationshipsPart();
-            List<Relationship> rels = rp.getRelationshipsByType(Namespaces.IMAGE);
+            List<Relationship> relationships = rp.getRelationshipsByType(Namespaces.IMAGE);
 
             List<Part> parts = new ArrayList<Part>();
-            for (Relationship relationship : rels) {
+            for (Relationship relationship : relationships) {
                 parts.add(rp.getPart(relationship));
             }
             // 添加资源文件定义
             for (Part p : parts) {
                 String relId = p.getSourceRelationships().get(0).getId();
+                //如果不存在该relId,拷贝图片
                 if(!relationshipsPart.isRelIdOccupied(relId)){
-                    copyImage(wordMLPackage,partStore,p);
+                    copyImage(wordMLPackage,partStore,p,relId);
                 }
             }
             // 添加资源文件存储
@@ -739,20 +742,20 @@ public final class DocxProcessUtil {
 
     /**
      * word合并时复制图片
+     * 将partStore中的Relationship复制到wordMLPackage中
      * @param wordMLPackage
      * @param partStore
      * @param p
      * @throws Exception
      */
-    public static void copyImage(WordprocessingMLPackage wordMLPackage, ZipPartStore partStore, Part p)throws Exception{
+    public static void copyImage(WordprocessingMLPackage wordMLPackage, ZipPartStore partStore, Part p,String relId)throws Exception{
         byte [] bytes = partStore.getByteArray(p.getPartName().getName().substring(1)).getBytes();
         ByteArrayInputStream bais = new ByteArrayInputStream(bytes);  
         BufferedImage bi1 = ImageIO.read(bais);
         if(bi1!=null){
         	BinaryPartAbstractImage imagePart = BinaryPartAbstractImage.createImagePart(wordMLPackage, bytes);
-            imagePart.getRelLast().setId(p.getSourceRelationships().get(0).getId());
+            imagePart.getRelLast().setId(relId);
         }
-        
     }
     
     /**
@@ -961,6 +964,62 @@ public final class DocxProcessUtil {
             return -1;
         }
     }
+    
+    public static byte[] getWordBytesByQuestion(WordprocessingMLPackage wordMLPackage,List<String> wordxmls) throws Exception{
+    	try {
+			RelationshipsPart mainRelationshipsPart = wordMLPackage.getMainDocumentPart().getRelationshipsPart();
+	        // 获取总的资源文件存储
+	        ZipPartStore partStore = (ZipPartStore) wordMLPackage.getSourcePartStore();
+	        //创建子Word
+        	WordprocessingMLPackage subWordPackage = WordprocessingMLPackage.createPackage();
+        	MainDocumentPart subMainDocumentPart = subWordPackage.getMainDocumentPart();
+        	//向子Word中添加内容
+        	for(String xml:wordxmls){
+        		Object obj = XmlUtils.unmarshalString(xml);
+                subMainDocumentPart.addObject(obj);
+        	}
+        	//向子Word中添加图片的关联关系
+        	RelationshipsPart subRelationshipsPart = subMainDocumentPart.getRelationshipsPart();
+        	List<Relationship> subRelationships = subRelationshipsPart.getRelationshipsByType(Namespaces.IMAGE);
+        	List<Object> blips = subMainDocumentPart.getJAXBNodesViaXPath("//a:blip",false);
+        	for(Object blip:blips){
+        		if (blip.getClass().equals(CTBlip.class)) {
+	        		CTBlip cTBlip = (CTBlip)blip;
+	        		Relationship relationship = mainRelationshipsPart.getRelationshipByID(cTBlip.getEmbed());
+	        		if(relationship!=null){
+	        			subRelationships.add(relationship);
+	        		}
+        		}
+        	}
+        	//向子Word中添加资源
+        	List<Part> parts = new ArrayList<Part>();
+            for (Relationship relationship : subRelationships) {
+            	if(mainRelationshipsPart.getPart(relationship)!=null){
+            		parts.add(mainRelationshipsPart.getPart(relationship));
+            	}
+            }
+            for (Part p : parts) {
+            	if(p.getSourceRelationships()!=null&&
+            			p.getSourceRelationships().size()>0){
+            		String relId = p.getSourceRelationships().get(0).getId();
+                    if(mainRelationshipsPart.isRelIdOccupied(relId)){
+                    	DocxProcessUtil.copyImage(subWordPackage,partStore,p,relId);
+                    }
+            	}
+            }
+            
+            return DocxProcessUtil.getPkgByte(subWordPackage);
+		} catch (Docx4JException e) {
+			e.printStackTrace();
+		} catch (FileNotFoundException e) {
+			e.printStackTrace();
+		} catch (IOException e) {
+			e.printStackTrace();
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return null;
+    }
 
     public static void main(String[] args) throws Exception {
         System.out.println(formatPWordMl("<p>A</p>"));

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

@@ -43,7 +43,7 @@ public class GenPaperService {
 
     @Autowired
     PaperDetailRepo paperDetailRepo;
-
+    
     @Autowired
     PaperDetailUnitRepo unitRepo;
 
@@ -364,14 +364,23 @@ public class GenPaperService {
             pd.setPaper(paper);
         }
         paperDetailRepo.save(details);
-        for(int i = 0;i<selectedUnits.size();i++){
-        	PaperDetailUnit pdu = selectedUnits.get(i);
-        	pdu.setNumber(i+1);
+        for(PaperDetailUnit pdu:selectedUnits){
         	pdu.setPaper(paper);
         }
         unitRepo.save(selectedUnits);
+        //给试卷中的小题设置number
+        List<PaperDetail> paperDetails = paperDetailRepo.findByPaperOrderByNumber(paper);
+        int index = 0;
+        for(PaperDetail paperDetail:paperDetails){
+        	List<PaperDetailUnit> paperDetailUnits = unitRepo.findByPaperDetailOrderByNumber(paperDetail);
+        	for(int i = 0;i<paperDetailUnits.size();i++){
+        		index++;
+        		PaperDetailUnit paperDetailUnit = paperDetailUnits.get(i);
+        		paperDetailUnit.setNumber(index);
+        	}
+        	unitRepo.save(paperDetailUnits);
+        }
         return paper;
-
     }
 
     /**

+ 0 - 1
cqb-paper/src/main/java/com/qmth/cqb/paper/model/computerTestModel/ComputerTestPaperDetail.java

@@ -38,7 +38,6 @@ public class ComputerTestPaperDetail {
 		this.number = paperDetail.getNumber();
 		this.name = paperDetail.getName();
 		this.totalScore = paperDetail.getScore();
-		this.questionCount = paperDetail.getUnitCount();
 	}
 	
 	public Integer getNumber() {

+ 38 - 3
cqb-paper/src/main/java/com/qmth/cqb/paper/service/ImportPaperService.java

@@ -13,6 +13,7 @@ import java.util.regex.Pattern;
 
 import com.qmth.cqb.base.dao.CourseRepo;
 import com.qmth.cqb.base.model.Course;
+
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.ArrayUtils;
@@ -34,6 +35,7 @@ import com.qmth.cqb.paper.model.ImportPaperMsg;
 import com.qmth.cqb.paper.model.Paper;
 import com.qmth.cqb.paper.model.PaperDetail;
 import com.qmth.cqb.paper.model.PaperDetailUnit;
+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.QuestionType;
@@ -64,6 +66,9 @@ public class ImportPaperService {
     @Autowired
     QuesService quesService;
 
+    @Autowired
+    QuesRepo quesRepo;
+    
     @Autowired
     Gson gson;
 
@@ -134,11 +139,15 @@ public class ImportPaperService {
         	checkAnswerISfull(paperDetailUnits,importPaperCheck);
             tempPaper = paperRepo.save(paper);
         }
-        if (paperDetails.size() > 0) {
+        if (paperDetails!=null&&paperDetails.size() > 0) {
             paperDetailRepo.save(paperDetails);
         }
-        if (questions.size() > 0) {
-            quesService.saveImportQuesList(questions);
+        if (questions!=null&&questions.size() > 0) {
+            for (Question question:questions) {
+            	String now = CommonUtils.getCurDateTime();
+            	question.setCreateTime(now);
+            }
+            quesRepo.save(questions);
         }
         if (paperDetailUnits.size() > 0) {
             paperDetailUnitRepo.save(paperDetailUnits);
@@ -191,6 +200,7 @@ public class ImportPaperService {
         tmpWordMlPackage = DocxProcessUtil.getTmpPackage(wordMLPackage);
         writePkg = DocxProcessUtil.getTmpPackage(wordMLPackage);
         byte[] writeByte = DocxProcessUtil.getPkgByte(writePkg);
+        
         // 获取word文档中所有段落
         List<Object> pList = DocxProcessUtil.getAllElementFromObject(wordMLPackage.getMainDocumentPart(), P.class);
         // 设置试卷
@@ -265,6 +275,7 @@ public class ImportPaperService {
                 }
                 // 设置WordMlPackage二进制数据
                 question.setQuesPkg(writeByte);
+                //question.setQuesPkg(getZipResource(writePkg,question));
                 // 设置question与Unit集合数据
                 question.setCourse(paper.getCourse());
                 question.setOrgId(user.getRootOrgId().toString());
@@ -295,6 +306,30 @@ public class ImportPaperService {
         FileUtils.deleteQuietly(file);
         return paper;
     }
+    
+    
+    private byte[] getZipResource(WordprocessingMLPackage wordMLPackage,Question question) throws Exception{
+    	List<String> wordXmls = getWordXmlByQuestion(question);
+    	List<Question> subQuestions = question.getSubQuestions();
+    	if(subQuestions!=null&&subQuestions.size()>0){
+    		for(Question subQuestion:subQuestions){
+        		wordXmls.addAll(getWordXmlByQuestion(subQuestion));
+        	}
+    	}
+    	return DocxProcessUtil.getWordBytesByQuestion(wordMLPackage,wordXmls);
+    }
+    
+    public List<String> getWordXmlByQuestion(Question question){
+    	List<String> wordXmls = new ArrayList<String>();
+    	wordXmls.add(question.getQuesBodyWord());
+    	List<QuesOption> options = question.getQuesOptions();
+    	if(options!=null&&options.size()>0){
+    		for(QuesOption quesOption:options){
+    			wordXmls.add(quesOption.getOptionBodyWord());
+    		}
+    	}
+    	return wordXmls;
+    }
 
     public boolean isMainQuesHeader(String pText){
         return pText.startsWith(ImportPaperMsg.left_bracket)

+ 2 - 0
cqb-paper/src/main/java/com/qmth/cqb/paper/service/export/ExportPaperAbstractService.java

@@ -773,6 +773,8 @@ public abstract class ExportPaperAbstractService {
     				questions.add(computerTestQuestion);
     			}
     			computerTestPaperDetail.setQuestions(questions);
+    			//paperDetail中的题数(unitCount)可能不准确,这里以questions的实际size为准
+    			computerTestPaperDetail.setQuestionCount(questions.size());
     			details.add(computerTestPaperDetail);
     		}
     		computerTestPaper.setDetails(details);

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

@@ -24,24 +24,13 @@ public interface QuesService {
      * @param question
      */
     public Question saveQues(Question question);
-
-    /**
-     * 批量保存导入试题
-     * 
-     * @param list
-     */
-    public void saveImportQuesList(List<Question> list);
-
     /**
      * 批量保存试题
-     *
      * @param list
      */
     public void saveQuesList(List<Question> list);
-
     /**
      * 查询所有试题
-     *
      * @param searchCondition
      * @param curPage
      * @param pageSize
@@ -53,7 +42,6 @@ public interface QuesService {
 
     /**
      * 查询按ID过滤的试题
-     *
      * @param idSet
      * @param curPage
      * @param pageSize
@@ -63,15 +51,12 @@ public interface QuesService {
 
     /**
      * 按ID获取试题
-     *
      * @param id
      * @return
      */
     public Question findById(String id);
-
     /**
      * 去除试题中的word
-     *
      * @param question
      */
     public void formatQues(Question question);

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

@@ -137,10 +137,10 @@ public class QuesServiceImpl implements QuesService{
         previous.setUpdateTime(now);
         updateSubId(previous);
     }*/
-
-    /**
-     * 保存试题
-     *
+    
+	/**
+     * 保存试题,用于页面新增和更新
+     * 导入时不能调用该方法,里面有更新Word的代码
      * @param question
      */
     public Question saveQues(Question question) {
@@ -164,19 +164,6 @@ public class QuesServiceImpl implements QuesService{
         }
         return quesRepo.save(question);
     }
-    
-    /**
-     * 批量保存导入试题
-     * 
-     * @param list
-     */
-    public void saveImportQuesList(List<Question> list) {
-        if (list != null) {
-            for (Question question : list) {
-            	saveQues(question);
-            }
-        }
-    }
 
     /**
      * 批量保存试题