Bladeren bron

完成机考数据包json文件中html代码的转译

chenken 7 jaren geleden
bovenliggende
commit
bed24e44b0

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

@@ -6,14 +6,15 @@ import java.math.RoundingMode;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 import java.util.Properties;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Stream;
 
-import com.qmth.cqb.utils.word.DocxProcessUtil;
 import org.apache.commons.lang3.StringEscapeUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.dom4j.Attribute;
@@ -23,6 +24,7 @@ import org.dom4j.DocumentHelper;
 import org.dom4j.Element;
 
 import cn.com.qmth.examcloud.common.dto.question.enums.QuesStructType;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -413,6 +415,41 @@ public final class CommonUtils {
         }
         return str.replaceAll("[\\t\\r\\f]*","");
     }
+    
+    /**
+	 * 替换掉字符串的Unicode字符为中文字符
+	 * 如下所示
+	 * \u0026ldquo;=“
+	 * \u0026mdash;=—
+	 * \u0026lt;=<
+	 * \u0026hellip;=… 
+	 * \u0026rdquo;=”
+	 * \u0026gt;=>
+	 */
+	public static String replaceUnicodeStr(String content){
+		try {
+			Pattern pattern = Pattern.compile("\\\\u\\w+;");
+			Matcher matcher = pattern.matcher(content);
+			Map<String,String> unicodeMap = new HashMap<String, String>();
+			while(matcher.find()){
+			      String unicodeStr = matcher.group();
+			      byte[] unicodeStrByte = unicodeStr.getBytes();
+				  String resultByte = new String(unicodeStrByte,"utf-8");
+				  String escapeStr = StringEscapeUtils.unescapeHtml4(StringEscapeUtils.unescapeEcmaScript(resultByte));
+				  unicodeMap.put(unicodeStr, escapeStr);
+			}
+			System.out.println(unicodeMap);
+			if(unicodeMap.size()>0){
+				for(String key:unicodeMap.keySet()){
+					 //replace函数替换时忽略正则表达式符号,replaceAll和replaceFirst函数替换时是使用正则表达式匹配的。
+					content = content.replace(key, unicodeMap.get(key));
+				}
+			}
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		return content;
+	}
 
     public static void main(String[] args) throws Exception{
         // QuesStructType quesStructType = getEnum(QuesStructType.class,"单选");

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

@@ -13,6 +13,7 @@ import java.io.InputStream;
 import java.io.OutputStream;
 import java.net.HttpURLConnection;
 import java.net.URL;
+import java.net.URLEncoder;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
@@ -103,8 +104,9 @@ public class FileDisposeUtil {
 	        //设置文件MIME类型  
 			response.setContentType(getContentType(filename));
 	        //设置Content-Disposition,名称强制为UTF-8
-			String fileEncode = System.getProperty("file.encoding");
-	        response.setHeader("Content-Disposition", "attachment;filename="+new String(filename.getBytes(fileEncode),"UTF-8"));
+			//String fileEncode = System.getProperty("file.encoding");
+	        //response.setHeader("Content-Disposition", "attachment;filename="+new String(filename.getBytes(fileEncode),"UTF-8"));
+	        response.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode(filename,"UTF-8"));
 	         // 设置强制下载不打开
 	         response.setContentType("application/octet-stream;charset=utf-8");
 	        //读取目标文件,通过response将目标文件写到客户端  

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

@@ -262,8 +262,9 @@ public abstract class ExportPaperAbstractService {
     	sortPaperDetailUnitExps(paperExp.getPaperDetails());
     	//如果每个小题分数不一样,题干后面添加分数
     	appendScoreToQuestionBody(paperExp.getPaperDetails());
-    	//给每个小题选项排序
+    	//1.设置题号 2.给小题选项进行排序 3.设置选项号 4.替换题干中的##为____
     	setUnitExpNumber(paperExp.getPaperDetails());
+    	//设置大题标题
     	setExpDtoTitle(paperExp.getPaperDetails());
     	return paperExp;
     }
@@ -423,7 +424,10 @@ public abstract class ExportPaperAbstractService {
     }
     
     /**
-	 * 给小题选项进行排序
+     * 1.设置题号
+	 * 2.给小题选项进行排序
+	 * 3.设置选项号
+	 * 4.替换题干中的##为____
 	 * @param paperDetails
 	 * @throws Exception
 	 */
@@ -441,10 +445,11 @@ public abstract class ExportPaperAbstractService {
 				}
 				List<Question> subQuesList = paperDetailUnit.getQuestion().getSubQuestions();
 				Question question = paperDetailUnit.getQuestion();
-				// 套题序号
 				if (subQuesList != null && subQuesList.size() > 0) {
+					//套题主题干
 					question.setQuesBodyWord(replaceQuesBlank(question.getQuesBodyWord(),subQuesList.get(0).getNumber()));
 					for (Question subQues : subQuesList) {
+						//处理子题题干,答案
 						subQues.setQuesBodyWord(setSubQuesNum(subQues.getQuesBodyWord(),subQues.getNumber()));
 						subQues.setQuesAnswerWord(setSubQuesNum(subQues.getQuesAnswerWord(),subQues.getNumber()));
 						subQues.setQuesBodyWord(replaceQuesBlank(subQues.getQuesBodyWord(),subQues.getNumber()));
@@ -458,6 +463,7 @@ public abstract class ExportPaperAbstractService {
 						}
 					}
 				} else {
+					//处理非套题题干、答案
 					question.setQuesBodyWord(setSubQuesNum(question.getQuesBodyWord(), paperDetailUnit.getNumber()));
 					question.setQuesAnswerWord(setSubQuesNum(question.getQuesAnswerWord(),paperDetailUnit.getNumber()));
 					question.setQuesBodyWord(replaceQuesBlank(question.getQuesBodyWord(),paperDetailUnit.getNumber()));

+ 4 - 0
cqb-paper/src/main/java/com/qmth/cqb/paper/service/export/SddxExportPaperService.java

@@ -32,6 +32,10 @@ public class SddxExportPaperService extends ExportPaperAbstractService{
 		PaperExp paperExp = initPaperExp(paperId);
 		if(paperExp!=null){
 			String paperfileName = paperExp.getName()+"_"+paperExp.getCourseNo()+"_"+ExamFileType.PAPER.getName()+DOCX_SUFFIX;
+			File firectory = new File(TEMP_FILE_EXP+File.separator+zipFileName);
+			if(!firectory.exists()){
+				firectory.mkdirs();
+			}
 			File file = new File(TEMP_FILE_EXP+File.separator+zipFileName+File.separator+paperfileName);
 			DocxProcessUtil.exportWordNew(paperExp, file,SDDX_TEMPLATE_PAPER);
 			DocxProcessUtil.processImage(zipFileName+File.separator+paperfileName,getPkgList(paperId));

+ 2 - 0
cqb-paper/src/main/java/com/qmth/cqb/paper/service/impl/ExportPaperServiceImpl.java

@@ -296,6 +296,8 @@ public class ExportPaperServiceImpl implements ExportPaperService{
 		//将对象转成 json对象
 		Gson gson = new Gson();
 		String strJSON = gson.toJson(computerTestPaper);
+		
+		strJSON = CommonUtils.replaceUnicodeStr(strJSON);
 		//生成文件流写入JSON文件
 		FileOutputStream outputStream = null;
 		try {

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

@@ -1,28 +1,46 @@
 package com.qmth.cqb;
 
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.commons.lang3.StringUtils;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.data.domain.Example;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
 import org.springframework.mock.web.MockHttpServletRequest;
 import org.springframework.mock.web.MockHttpServletResponse;
 import org.springframework.test.context.junit4.SpringRunner;
 
 import cn.com.qmth.examcloud.common.dto.question.QuestionDto;
 
+import com.qmth.cqb.paper.dao.ExportServiceManageRepo;
 import com.qmth.cqb.paper.dao.PaperRepo;
 import com.qmth.cqb.paper.model.ExamFile;
 import com.qmth.cqb.paper.model.ExamPaper;
+import com.qmth.cqb.paper.model.ExportServiceManage;
 import com.qmth.cqb.paper.model.Paper;
 import com.qmth.cqb.paper.service.ExamFileService;
 import com.qmth.cqb.paper.service.ExtractConfigService;
+import com.qmth.cqb.paper.service.PaperService;
+import com.qmth.cqb.paper.service.export.ExportPaperAbstractService;
+import com.qmth.cqb.paper.service.export.SddxExportPaperService;
 import com.qmth.cqb.paper.service.export.SxsfExportPaperService;
+import com.qmth.cqb.utils.SpringContextUtils;
 import com.qmth.cqb.utils.enums.ExamFileType;
+import com.qmth.cqb.utils.enums.PaperType;
 
 /**
  * @author  	chenken
@@ -43,10 +61,75 @@ public class ExtractConfigServiceTest {
 	
 	@Autowired
 	private ExamFileService examFileService;
+	@Autowired
+	private ExportServiceManageRepo exportServiceManageRepo;
+	@Autowired
+	private SddxExportPaperService sddxExportPaperService;
+	@Autowired
+    private MongoTemplate mongoTemplate;
 	
 	private MockHttpServletRequest request;  
     private MockHttpServletResponse response; 
     
+    @Test
+    public void downloadPaper() throws Exception{
+    	Query query = new Query();
+    	query.addCriteria(Criteria.where("orgId").is(135+""));
+    	query.addCriteria(Criteria.where("paperType").is(PaperType.GENERATE.name()));
+    	List<Paper> paperList = this.mongoTemplate.find(query, Paper.class);
+    	for(Paper paper:paperList){
+    		try {
+    			StringBuffer sb = new StringBuffer();
+    			List<String> paperIds = readFromFile();
+    			for(String paperId:paperIds){
+    				sb.append(paperId);
+    	        	sb.append("\r\n");
+    			}
+    			if(!paperIds.contains(paper.getId())){
+    				System.out.println("当前正在导出ID:"+paper.getId());
+    				sddxExportPaperService.downloadPaper(paper.getId(), "shandong");
+    				writeToFile(sb.toString()+"\r\n"+paper.getId());
+    			}
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+    	}
+    }
+    
+    /** 
+     * DOC 从文件里读内容. 
+     *  
+     * @throws IOException 
+     */  
+    private static List<String> readFromFile() throws IOException {  
+    	BufferedReader bReader = new BufferedReader(new FileReader("E:\\paperIds.txt"));
+    	List<String> paperIds = new ArrayList<String>();
+    	String temp = "";
+        while((temp=bReader.readLine())!=null) {
+        	if(StringUtils.isNotBlank(temp)){
+        		paperIds.add(temp);
+        	}
+        }
+        bReader.close();
+        return paperIds;
+    }
+    
+    /** 
+     * DOC 往文件里写入数据. 
+     *  
+     * @throws IOException 
+     */  
+    private static void writeToFile(String writerContent) throws IOException {  
+        File file = new File("E:\\paperIds.txt");// 要写入的文本文件  
+        if (!file.exists()) {// 如果文件不存在,则创建该文件  
+            file.createNewFile();  
+        }  
+        FileWriter writer = new FileWriter(file);// 获取该文件的输出流  
+        writer.write(writerContent);// 写内容  
+        writer.flush();// 清空缓冲区,立即将输出流里的内容写到文件里  
+        writer.close();// 关闭输出流,施放资源  
+    }
+    
     @Test
 	public void test1() throws Exception{
     	ExamFile examFile = new ExamFile();