Browse Source

科目拆分错误信息下载

xiatian 10 months ago
parent
commit
2523ac4f10

+ 1 - 2
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/file/enums/FileType.java

@@ -8,8 +8,7 @@ public enum FileType {
     SHEET("原图", "sheet/%d/%s/%s-%d.%s"), SLICE("裁切图", "slice/%d/%s/%s-%d.%s"), JSON("作答内容", "json/%d/%s/%s.%s"), PACKAGE(
             "签到表", "package/%d/%s/%d.%s"), PAPER("试卷", "paper/%d/%s.%s"), ANSWER("标答", "answer/%d/%s.%s"), CARD("题卡",
             "card/%d/%s.%s"), EXCHANGE("文件", "exchange/%s"), ANSWER_CARD("题卡", "card/answer/%d/%s.%s"), REPORT("报表",
-            "report/%d/%s/%s.%s"), INCOMPLETE("缺页异常表", "incomplete/%d/%s.%s")
-    ,SUBJECTSPLITERR("科目拆分异常信息", "subject-split-err/%d/%d/%d/error.txt");
+            "report/%d/%s/%s.%s"), INCOMPLETE("缺页异常表", "incomplete/%d/%s.%s");
 
     private String name;
 

+ 0 - 4
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/file/service/FileService.java

@@ -84,8 +84,4 @@ public interface FileService {
 
     String getIncompleteUri(Integer examId, String name);
 
-	String getSubjectSplitErrUri(int schoolId, int examId, int userId);
-
-	void uploadSubjectSplitErr(InputStream ins, String md5, int schoolId, int examId, int userId) throws Exception;
-
 }

+ 0 - 8
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/file/service/impl/FileServiceImpl.java

@@ -121,10 +121,6 @@ public class FileServiceImpl implements FileService, InitializingBean, Disposabl
         store.write(getPackageUri(examId, packageCode, index), ins, md5);
     }
     @Override
-    public void uploadSubjectSplitErr(InputStream ins, String md5, int schoolId, int examId, int userId) throws Exception {
-        store.write(getSubjectSplitErrUri(schoolId, examId, userId), ins, md5);
-    }
-    @Override
     public void uploadPaper(InputStream ins, String md5, int examId, String subjectCode, FormatType type)
             throws Exception {
         if (!checkFormat(type, FormatType.PDF, FormatType.JSON)) {
@@ -207,10 +203,6 @@ public class FileServiceImpl implements FileService, InitializingBean, Disposabl
         return list;
     }
     @Override
-    public String getSubjectSplitErrUri(int schoolId,int examId, int userId) {
-        return FileType.SUBJECTSPLITERR.getPath(schoolId, examId, userId);
-    }
-    @Override
     public String getPaperUri(int examId, String subjectCode, FormatType type) {
         return FileType.PAPER.getPath(examId, subjectCode, type.getExtName());
     }

+ 44 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/BaseExamController.java

@@ -1,7 +1,13 @@
 package cn.com.qmth.stmms.admin.exam;
 
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
 import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
 import java.io.PrintWriter;
+import java.net.URLEncoder;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -128,4 +134,42 @@ public class BaseExamController extends BaseController {
         return "";
     }
 
+    protected void exportFile(String fileName, File file,HttpServletResponse response) {
+        OutputStream out = null;
+        InputStream in = null;
+        try {
+            in = new FileInputStream(file);
+            fileName = URLEncoder.encode(fileName, "UTF-8");
+            response.reset();
+            response.setHeader("Content-Disposition", "inline; filename=" + fileName);
+            response.addHeader("Content-Length", "" + file.length());
+            response.setContentType("application/octet-stream;charset=UTF-8");
+            out = new BufferedOutputStream(response.getOutputStream());
+            IOUtils.copy(in, out);
+            out.flush();
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        } finally {
+            IOUtils.closeQuietly(out);
+            IOUtils.closeQuietly(in);
+        }
+    }
+
+    protected void exportFile(String fileName, InputStream in,HttpServletResponse response) {
+        OutputStream out = null;
+        try {
+            fileName = URLEncoder.encode(fileName, "UTF-8");
+            response.reset();
+            response.setHeader("Content-Disposition", "inline; filename=" + fileName);
+            response.setContentType("application/octet-stream;charset=UTF-8");
+            out = new BufferedOutputStream(response.getOutputStream());
+            IOUtils.copy(in, out);
+            out.flush();
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        } finally {
+            IOUtils.closeQuietly(out);
+            IOUtils.closeQuietly(in);
+        }
+    }
 }

+ 33 - 36
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/SubjectController.java

@@ -1,11 +1,8 @@
 package cn.com.qmth.stmms.admin.exam;
 
 import java.io.File;
-import java.io.FileInputStream;
-import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.UUID;
 import java.util.stream.Collectors;
 
 import javax.servlet.http.HttpServletRequest;
@@ -33,7 +30,6 @@ import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
 import cn.com.qmth.stmms.biz.exam.service.ExamService;
 import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
 import cn.com.qmth.stmms.biz.exam.service.query.ExamSubjectSearchQuery;
-import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
 import cn.com.qmth.stmms.biz.school.model.School;
 import cn.com.qmth.stmms.biz.school.service.SchoolService;
@@ -45,7 +41,6 @@ import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
 import cn.com.qmth.stmms.common.utils.ImportExcel;
-import cn.com.qmth.stmms.common.utils.MD5Util;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 import net.sf.json.JSONArray;
 import net.sf.json.JSONObject;
@@ -54,20 +49,17 @@ import net.sf.json.JsonConfig;
 @Controller
 @RequestMapping("/admin/exam/subject")
 public class SubjectController extends BaseExamController {
-    private static Logger log = LoggerFactory.getLogger(SubjectController.class);
+	private static Logger log = LoggerFactory.getLogger(SubjectController.class);
 	@Autowired
 	private ExamSubjectService subjectService;
 
 	@Autowired
 	private ExamService examService;
-	@Autowired
-	private FileService fileService;
-	
 	@Autowired
 	private SchoolService schoolService;
-    @Value("${file.temp}")
-    private String tempFile;
-    
+	@Value("${file.temp}")
+	private String tempFile;
+
 	@RequestMapping("/list")
 	@ResponseBody
 	public JSONArray list(HttpServletRequest request, @RequestParam Integer examId) {
@@ -151,10 +143,11 @@ public class SubjectController extends BaseExamController {
 		model.addAttribute("schoolId", schoolId);
 		model.addAttribute("schoolName", s.getName());
 		List<Exam> examList = examService.findBySchoolId(schoolId);
-		if(examList!=null&&examList.size()>0) {
-			List<Exam> tem=examList.stream().filter(e->!ExamStatus.FINISH.equals(e.getStatus())).collect(Collectors.toList());
+		if (examList != null && examList.size() > 0) {
+			List<Exam> tem = examList.stream().filter(e -> !ExamStatus.FINISH.equals(e.getStatus()))
+					.collect(Collectors.toList());
 			model.addAttribute("examList", tem);
-		}else {
+		} else {
 			model.addAttribute("examList", examList);
 		}
 		return "modules/exam/subjectSplit";
@@ -171,37 +164,41 @@ public class SubjectController extends BaseExamController {
 			model.addAttribute("schoolName", s.getName());
 			List<Exam> examList = examService.findBySchoolId(schoolId);
 			model.addAttribute("examList", examList);
-			ImportExcel ei= new ImportExcel(file, 1, 0);
+			ImportExcel ei = new ImportExcel(file, 1, 0);
 			List<SubjectSplit> list = ei.getDataList(SubjectSplit.class);
-			String errMsg=subjectService.split(schoolId,examId,list);
-			if(StringUtils.isBlank(errMsg)) {
+			String errMsg = subjectService.split(schoolId, examId, list);
+			if (StringUtils.isBlank(errMsg)) {
 				model.addAttribute("message", "已成功导入");
-			}else {
+			} else {
 				WebUser wu = RequestUtils.getWebUser(request);
-				File errFile = new File(tempFile +File.separator+ "subject-split-err"+File.separator +UUID.randomUUID().toString()+ ".txt");
-				InputStream in=null;
-				try {
-					errFile.getParentFile().mkdirs();
-					FileUtils.write(errFile, errMsg,"utf-8");
-					in=new FileInputStream(errFile);
-					fileService.uploadSubjectSplitErr(in, MD5Util.md5Hex(errFile), schoolId,
-							examId, wu.getId());
-					model.addAttribute("errmsgUrl", fileService.getFileServer()+fileService.getSubjectSplitErrUri(schoolId, examId, wu.getId()));
-					model.addAttribute("errmsg", "导入信息有误,请查看error.txt文件");
-				} finally {
-					if(in!=null){
-						in.close();
-					}
+				File errFile = new File(getSubjectSplitErrFile(wu.getId()));
+				errFile.getParentFile().mkdirs();
+				if (errFile.exists()) {
 					errFile.delete();
 				}
+				FileUtils.write(errFile, errMsg, "utf-8");
+				model.addAttribute("errmsgFile", true);
+				model.addAttribute("errmsg", "导入信息有误,请查看error.txt文件");
 			}
-		}catch (Exception e) {
-			log.error("导入失败",e);
-			model.addAttribute("errmsg", "导入失败:"+e.getMessage());
+		} catch (Exception e) {
+			log.error("导入失败", e);
+			model.addAttribute("errmsg", "导入失败:" + e.getMessage());
 		}
 		return "modules/exam/subjectSplit";
 	}
 
+	@RequestMapping(value = "split/err", method = RequestMethod.GET)
+	public void getImportTemplate(HttpServletRequest request, HttpServletResponse response) {
+		WebUser wu = RequestUtils.getWebUser(request);
+		File file = new File(getSubjectSplitErrFile(wu.getId()));
+		exportFile("error.txt", file, response);
+	}
+
+	private String getSubjectSplitErrFile(Integer userId) {
+		String path = tempFile + File.separator + "subject-split-err" + File.separator + userId + File.separator + "error.txt";
+		return path;
+	}
+
 	@RequestMapping(value = "split/template")
 	public String splitTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
 		try {

+ 2 - 36
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/subjectSplit.jsp

@@ -39,40 +39,7 @@
                 }
             });
         });
-        function urlToBlob(url, cb) {
-        	  const xhr = new XMLHttpRequest();
-        	  xhr.open('GET', url, true);
-        	  xhr.responseType = 'blob';
-        	  xhr.onload = function () {
-        	    if (xhr.status == 200) {
-        	      cb(URL.createObjectURL(xhr.response));
-        	    }
-        	  };
-        	  xhr.send();
-        	}
 
-        	function saveAs(blob, filename) {
-        	  if (window.navigator.msSaveOrOpenBlob) {
-        	    navigator.msSaveBlob(blob, filename);
-        	  } else {
-        	    console.log('blob', blob);
-        	    var link = document.createElement('a');
-        	    var body = document.querySelector('body');
-        	    link.href = blob;
-        	    link.download = filename;
-        	    link.style.display = 'none';
-        	    body.appendChild(link);
-        	    link.click();
-        	    body.removeChild(link);
-        	    window.URL.revokeObjectURL(link.href);
-        	  }
-        	}
-
-        	function downloadByCrossUrl(url, filename) {
-        	  urlToBlob(url, (blob) => {
-        	    saveAs(blob, filename);
-        	  });
-        	}
     </script>
 </head>
 <body>
@@ -111,9 +78,8 @@
 			<label class="control-label"></label>
 			<div class="controls">
 				<a href="${ctx}/admin/exam/subject/split/template">下载模板</a>
-				<c:if test="${errmsgUrl!=null}">
-					<a href="#" style="margin-left: 50px"
-						onclick="downloadByCrossUrl('${errmsgUrl}','error.txt')">error.txt</a>
+				<c:if test="${errmsgFile!=null}">
+					<a href="${ctx}/admin/exam/subject/split/err" style="margin-left: 50px">error.txt</a>
 				</c:if>
 			</div>
 		</div>