Kaynağa Gözat

提交题库后台 BUG

chenken 7 yıl önce
ebeveyn
işleme
6705ac10d0

+ 1 - 1
cqb-comm-utils/pom.xml

@@ -205,7 +205,7 @@
         <dependency>
 		  <groupId>com.upyun</groupId>
 		  <artifactId>java-sdk</artifactId>
-		  <version>3.13</version>
+		  <version>3.16</version>
 		</dependency>
     </dependencies>
 </project>

+ 59 - 21
cqb-comm-utils/src/main/java/com/qmth/cqb/utils/FileDisposeUtil.java

@@ -21,7 +21,6 @@ import java.util.zip.ZipOutputStream;
 
 import javax.servlet.http.HttpServletResponse;
 
-import org.apache.commons.io.FileUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -36,32 +35,46 @@ public class FileDisposeUtil {
 	
 	private static final Logger logger = LoggerFactory.getLogger(FileDisposeUtil.class);
 	
-	public static boolean saveUrlAs(String fileUrl, String fileName) {
+	/**
+	 * 将网络文件保存到本地
+	 * @param fileUrl		   网络文件URL
+	 * @param localFilePath  例如D:/123.txt
+	 * @return
+	 */
+	public static boolean saveUrlAs(String fileUrl,String localFilePath) {
 		HttpURLConnection connection = null;
-		DataOutputStream out = null;
-		DataInputStream in = null;
+		FileOutputStream fileOutputStream = null;
+		DataOutputStream dataOutputStream = null;
+		DataInputStream dataInputStream = null;
 		try {
 			URL url = new URL(fileUrl);
 			connection = (HttpURLConnection) url.openConnection();
-			in = new DataInputStream(connection.getInputStream());
-			out = new DataOutputStream(new FileOutputStream(fileName));
+			dataInputStream = new DataInputStream(connection.getInputStream());
+			fileOutputStream = new FileOutputStream(localFilePath);
+			dataOutputStream = new DataOutputStream(fileOutputStream);
 			byte[] buffer = new byte[4096];
 			int count = 0;
-			while ((count = in.read(buffer)) > 0) {
-				out.write(buffer, 0, count);
+			while ((count = dataInputStream.read(buffer)) > 0) {
+				dataOutputStream.write(buffer, 0, count);
 			}
 			return true;
 		} catch (Exception e) {
 			return false;
 		}finally {
 			try {
-				if (out != null) {
-					out.close();
-					out = null;
+				if(fileOutputStream!=null){
+					fileOutputStream.flush();
+					fileOutputStream.close();
+					fileOutputStream = null;
 				}
-				if (in != null) {
-					in.close();
-					in = null;
+				if (dataOutputStream != null) {
+					dataOutputStream.flush();
+					dataOutputStream.close();
+					dataOutputStream = null;
+				}
+				if (dataInputStream != null) {
+					dataInputStream.close();
+					dataInputStream = null;
 				}
 			} catch (IOException e) {
 				e.printStackTrace();
@@ -72,13 +85,16 @@ public class FileDisposeUtil {
 			}
 		}
 	}
+	
 	/**
-	 * 下载文件
+	 * 下载服务器上的文件
 	 * @param filename		文件名称
 	 * @param fullFilePath	文件全路径
 	 * @param response
 	 */
 	public static void downloadFile(String filename,String fullFilePath,HttpServletResponse response){
+		InputStream in = null;
+		OutputStream out = null;
 		try {
 			//设置编码
 			response.setCharacterEncoding("UTF-8");
@@ -92,8 +108,8 @@ public class FileDisposeUtil {
 	        //读取目标文件,通过response将目标文件写到客户端  
 	        //获取目标文件的绝对路径  
 	        //读取文件  
-			InputStream in = new FileInputStream(fullFilePath);
-			OutputStream out = response.getOutputStream();  
+			in = new FileInputStream(fullFilePath);
+			out = response.getOutputStream();  
 	        //写文件  
 	        byte[] buffer = new byte[4096];
 			int count = 0;
@@ -101,13 +117,27 @@ public class FileDisposeUtil {
 				out.write(buffer, 0, count);
 			} 
 	        response.flushBuffer();
-	        in.close();  
 	        out.close(); 
+	        in.close();  
 		} catch (FileNotFoundException e) {
 			e.printStackTrace();
 		} catch (IOException e) {
 			e.printStackTrace();
-		}  
+		}finally{
+			try{
+				if (null != out){
+					out.close();
+					out = null;
+				}
+				if (null != in){
+					in.close();
+					in = null;
+				}
+			} catch (IOException e) {
+				e.printStackTrace();
+				throw new RuntimeException(e);
+			}
+		}
          
 	}
 	/**
@@ -179,6 +209,10 @@ public class FileDisposeUtil {
 						flag = true;
 					}
 				}
+				bis.close();
+				fis.close();
+				zos.close();
+				fos.close();
 			} catch (FileNotFoundException e) {
 				e.printStackTrace();
 				throw new RuntimeException(e);
@@ -216,9 +250,13 @@ public class FileDisposeUtil {
 	public static void createDirectory(String downloadDirectory) {
 		File directory = new File(downloadDirectory);
 		if(directory.exists()){
-			FileUtils.deleteQuietly(directory);
+			File[] files = directory.listFiles();
+			for(File file:files){
+				file.delete();
+			}
+		}else{
+			directory.mkdir();
 		}
-		directory.mkdir();
 	}
 	
 	public static void main(String[] args) {

+ 1 - 0
cqb-paper/src/main/java/com/qmth/cqb/paper/dao/PaperDetailUnitRepo.java

@@ -19,4 +19,5 @@ public interface PaperDetailUnitRepo extends MongoRepository<PaperDetailUnit, St
     List<PaperDetailUnit> findByQuestionIn(List<Question> questionList);
     PaperDetailUnit findById(String id);
     List<PaperDetailUnit> findByQuestionType(QuesStructType quesType);
+    Long countByPaperDetail(PaperDetail paperDetail);
 }

+ 1 - 1
cqb-paper/src/main/java/com/qmth/cqb/paper/model/PaperDetailUnit.java

@@ -206,7 +206,7 @@ public class PaperDetailUnit implements Serializable, Comparable<PaperDetailUnit
         this.score = 0d;
     }
 
-    @Override
+	@Override
     public int compareTo(PaperDetailUnit unit) {
         /*if (unit != null) {
             if (this.getQuestionType().getId() > unit.getQuestionType().getId()) {

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

@@ -6,7 +6,6 @@ import java.io.FileOutputStream;
 import java.io.IOException;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -584,28 +583,47 @@ public class PaperService {
     }
 
     /**
-     * 填充大题小题数量与分数
-     *
+     *1.重新设置小题number,并返回试卷总分
+     *2.重新计算大题的总分和小题总数
+     *3.重新保存试卷大题数量、小题数量、试卷总分等信息
      * @param paper
      */
     public void formatPaper(Paper paper, AccessUser user) {
-        List<PaperDetail> paperDetails = paperDetailRepo.findByPaperOrderByNumber(paper);
-        // 计算试卷总分
-        List<PaperDetailUnit> paperDetailUnitAll = paperDetailUnitRepo.findByPaperOrderByNumber(paper);
-        int allQuesCount = 0;
+        double paperTotalScore = reSetPaperDetailUnit(paper);
+        Map<String,Object> paperInfoMap = reSetPaperDetail(paper);
+        reSetPaper(paper,user,paperInfoMap,paperTotalScore);
+    }
+    
+	/**
+     * 重新设置小题number,并返回试卷总分
+     * @param paper
+     * @return
+     */
+    private double reSetPaperDetailUnit(Paper paper) {
+    	List<PaperDetailUnit> paperDetailUnitAll = paperDetailUnitRepo.findByPaperOrderByNumber(paper);
         double totalScore = 0;
         for (int i = 0;i<paperDetailUnitAll.size();i++) {
         	PaperDetailUnit unit = paperDetailUnitAll.get(i);
             if (unit.getScore() != null) {
                 totalScore += unit.getScore();
             }
-            //重新设置序号
             unit.setNumber(i+1);
         }
-        // 计算各大题总分
+        paperDetailUnitRepo.save(paperDetailUnitAll);
+        return totalScore;
+	}
+
+	/**
+     * 重新计算大题的总分和小题总数
+     * @param paper
+     */
+    private Map<String,Object> reSetPaperDetail(Paper paper) {
+    	Map<String,Object> paperInfoMap = new HashMap<String,Object>();
+    	int allQuesCount = 0;
+    	List<PaperDetail> paperDetails = paperDetailRepo.findByPaperOrderByNumber(paper);
+        // 计算各大题总分和小题数量
         for (PaperDetail paperDetail : paperDetails) {
             List<PaperDetailUnit> paperDetailUnits = paperDetailUnitRepo.findByPaperDetailOrderByNumber(paperDetail);
-            Collections.sort(paperDetailUnits);
             if (paperDetailUnits.size() > 0) {
                 int count = 0;
                 double score = 0;
@@ -614,8 +632,9 @@ public class PaperService {
                     if (unit.getScore() != null) {
                         score += unit.getScore();
                     }
-                    if (unit.getQuestion() != null && unit.getQuestion().getSubQuestions() != null
-                            && unit.getQuestion().getSubQuestions().size() > 0) {
+                    if (unit.getQuestion() != null 
+                    		&& unit.getQuestion().getSubQuestions() != null
+	                            && unit.getQuestion().getSubQuestions().size() > 0) {
                         nestQusNum += unit.getQuestion().getSubQuestions().size() - 1;
                     }
                 }
@@ -627,17 +646,31 @@ public class PaperService {
                 paperDetail.setScore(0d);
             }
         }
-        paper.setUnitCount(allQuesCount);
-        paper.setPaperDetailCount(paperDetails.size());
-        paper.setTotalScore(totalScore);
+        paperDetailRepo.save(paperDetails);
+        paperInfoMap.put("allQuesCount", allQuesCount);
+        paperInfoMap.put("paperDetails", paperDetails);
+        return paperInfoMap;
+	}
+    
+    /**
+     * 重新设置试卷大题数量、小题数量、试卷总分等属性
+     * @param paper
+     * @param user
+     * @param paperInfoMap
+     * @param paperTotalScore
+     */
+    private void reSetPaper(Paper paper, AccessUser user,Map<String, Object> paperInfoMap,double paperTotalScore) {
+    	List<PaperDetail> paperDetails = (List<PaperDetail>) paperInfoMap.get("paperDetails");
+        paper.setPaperDetailCount(paperDetails.size());//设置大题数量
+        paper.setUnitCount(Integer.parseInt(paperInfoMap.get("allQuesCount")+""));//设置小题数量
+        paper.setTotalScore(paperTotalScore);//设置试卷总分
         if (user != null) {
             paper.setLastModifyName(user.getName());
         }
-        paperDetailRepo.save(paperDetails);
         paperRepo.save(paper);
-    }
+	}
 
-    /**
+	/**
      * 先备份准备删掉的试题,然后再删掉
      *
      * @param questionId
@@ -684,21 +717,13 @@ public class PaperService {
         quesService.updateQuesWord(question);
         question = quesRepo.save(question);
         Paper paper = paperRepo.findOne(paperId);
-        PaperDetail pd = paperDetailRepo.findOne(paperDetailId);
-        PaperDetailUnit pdu = new PaperDetailUnit();
-        List<PaperDetailUnit> pdus = paperDetailUnitRepo.findByPaperDetailOrderByNumber(pd);
-        pdu.setPaper(paper);
-        pdu.setQuestionType(question.getQuestionType());
-        pdu.setQuestion(question);
-        pdu.setCreateTime(CommonUtils.getCurDateTime());
-        pdu.setPaperDetail(pd);
-        pdus.add(pdu);
-        pdu.setNumber(pdus.size());
-        pdu.setScore(0d);
-        paperDetailUnitRepo.save(pdu);
-        formatPaper(paper, user);
+        PaperDetail paperDetail = paperDetailRepo.findOne(paperDetailId);
+        PaperDetailUnit paperDetailUnit = new PaperDetailUnit(paper,paperDetail,question);
+        long paperDetailUnitCount = paperDetailUnitRepo.countByPaperDetail(paperDetail);
+        paperDetailUnit.setNumber(Integer.parseInt(paperDetailUnitCount+""));
+        paperDetailUnitRepo.save(paperDetailUnit);
+        formatPaper(paper,user);
         return paper;
-
     }
 
     /**
@@ -717,32 +742,13 @@ public class 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) {
         Set<String> selectedIds = new HashSet<>();
         Paper paper = paperRepo.findOne(paperId);
-        // QuestionSearchCondition ques = new QuestionSearchCondition();
-        // if (quesType != null) {
-        // ques.setQuestionType(quesType);
-        // }
-        // Map<String, String> quesParams = new HashMap<String, String>();
-        // quesParams.put("courseName", paper.getCourseName());
-        // ques.setQuesParams(quesParams);
         List<PaperDetailUnit> pdus = paperDetailUnitRepo.findByPaperOrderByNumber(paper);
         for (PaperDetailUnit pdu : pdus) {
             selectedIds.add(pdu.getQuestion().getId());
         }
-        // Page<Question> allQuestions = quesService.findAll(ques, curPage,
-        // pageSize);
-        // Iterator<Question> que = allQuestions.iterator();
-        // while (que.hasNext()) {
-        // if (selectedIds.contains(que.next().getId())) {
-        // que.remove();
-        // }
-        // }
         return quesService.findByIdExclude(selectedIds, paper.getCourseNo(), quesType, curPage, pageSize,accessUser.getRootOrgId());
     }
 
@@ -1073,8 +1079,13 @@ public class PaperService {
 					if(quesOption.getNumber().equals(CommonUtils.characterToNumber(numbers[2]).toString())){
 						String optionBody = quesOption.getOptionBody();
 						if(!optionBody.contains(fileName)){
-							String optionBodyNew = optionBody.substring(0, optionBody.lastIndexOf("</p>")) 
-									+ "<a id=\""+fileName+"\" name=\""+fileName+"\"></a></p>";
+							String optionBodyNew = "";
+							if(StringUtils.isBlank(optionBody)){
+								optionBodyNew = "<p><a id=\""+fileName+"\" name=\""+fileName+"\"></a></p>";
+							}else{
+								optionBodyNew = optionBody.substring(0, optionBody.lastIndexOf("</p>")) 
+										+ "<a id=\""+fileName+"\" name=\""+fileName+"\"></a></p>";
+							}
 							quesOption.setOptionBody(optionBodyNew);
 						}
 					}
@@ -1087,8 +1098,4 @@ public class PaperService {
 			quesRepo.save(question);
 		}
     }
-    	
-    public void checkPaperAudio(String paperId){
-    	
-    }
 }

+ 24 - 37
cqb-paper/src/main/java/com/qmth/cqb/paper/service/impl/ExtractConfigFileServiceImpl.java

@@ -11,7 +11,6 @@ import java.util.Set;
 
 import javax.servlet.http.HttpServletResponse;
 
-import main.java.com.UpYun;
 
 import org.apache.commons.io.FileUtils;
 import org.slf4j.Logger;
@@ -102,15 +101,6 @@ public class ExtractConfigFileServiceImpl implements ExtractConfigFileService {
 	@Value("${upyun.zipDirectory}")
 	private String zipDirectory;
 	
-	@Value("${upyun.bucketName}")
-	private String bucketName;
-	
-	@Value("${upyun.userName}")
-	private String userName;
-	
-	@Value("${upyun.password}")
-	private String password;
-	
 	@Override
 	public void saveExtractConfigAndBuildPaperFile(ExtractConfig extractConfig,Integer isbuildFile,AccessUser accessUser) throws Exception {
 		//查询试卷导出设置
@@ -196,9 +186,7 @@ public class ExtractConfigFileServiceImpl implements ExtractConfigFileService {
 		if(examFiles!=null&&examFiles.size()>0){
 			List<Paper> papers = paperRepo.findByIdIn(paperIds);
 			for(ExamFile examFile:examFiles){
-				UpYun upyun = new UpYun(bucketName,userName,password);
-				File file = new File(downloadDirectory+File.separator+examFile.getFileName());
-				upyun.readFile(examFile.getFilePath(),file);
+				FileDisposeUtil.saveUrlAs(downloadUrl+examFile.getFilePath(),downloadDirectory+File.separator+examFile.getFileName());
 				downloadQuestionAudio(papers,examFile);
 			}
 		}
@@ -213,6 +201,29 @@ public class ExtractConfigFileServiceImpl implements ExtractConfigFileService {
 		FileUtils.deleteQuietly(new File(zipDirectory));
 	}
 	
+	/**
+	 * 下载题目音频文件
+	 */
+	private void downloadQuestionAudio(List<Paper> papers,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()){
+							List<QuestionAudio> questionAudios = questionAudioService.findQuestionAudiosByQuestionId(unit.getQuestion().getId());
+							for(QuestionAudio audio:questionAudios){
+								String audioFileName = examFile.getFileName().split("\\.")[0]+"_"+audio.getFileName();
+								FileDisposeUtil.saveUrlAs(downloadUrl+audio.getFileUrl(), downloadDirectory+File.separator+audioFileName);
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+	
 	/**
 	 * 得到调卷规则中已完成的试卷的ID集合
 	 * @param exportModel
@@ -350,29 +361,5 @@ public class ExtractConfigFileServiceImpl implements ExtractConfigFileService {
     	logger.info("批量生成试卷结构完成");
 	}
 
-	/**
-	 * 下载题目音频文件
-	 */
-	private void downloadQuestionAudio(List<Paper> papers,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()){
-							List<QuestionAudio> questionAudios = questionAudioService.findQuestionAudiosByQuestionId(unit.getQuestion().getId());
-							UpYun upyun = new UpYun(bucketName,userName,password);
-							for(QuestionAudio audio:questionAudios){
-								String audioFileName = examFile.getFileName().split("\\.")[0]+"_"+audio.getFileName();
-								File file = new File(downloadDirectory+File.separator+audioFileName);
-								upyun.readFile(audio.getFileUrl(),file);
-							}
-						}
-					}
-				}
-			}
-		}
-	}
 	
 }