Browse Source

归档文件上传下载

yin 1 năm trước cách đây
mục cha
commit
f042d5d242

+ 36 - 1
distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkDocumentController.java

@@ -1,6 +1,7 @@
 package com.qmth.distributed.print.api.mark;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
@@ -12,12 +13,19 @@ import org.springframework.web.multipart.MultipartFile;
 
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.util.Result;
 import com.qmth.teachcloud.common.util.ResultUtil;
+import com.qmth.teachcloud.mark.bean.archivescore.ArchiveStudentQuery;
 import com.qmth.teachcloud.mark.bean.document.ArchivePaperQuery;
 import com.qmth.teachcloud.mark.bean.document.MarkDocumantQuery;
+import com.qmth.teachcloud.mark.entity.MarkDocument;
+import com.qmth.teachcloud.mark.entity.MarkPaper;
+import com.qmth.teachcloud.mark.enums.DocumentType;
 import com.qmth.teachcloud.mark.service.MarkDocumentService;
 import com.qmth.teachcloud.mark.service.MarkPaperService;
+import com.qmth.teachcloud.mark.service.MarkStudentService;
+import com.qmth.teachcloud.mark.service.ScanPackageService;
 
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -37,6 +45,10 @@ public class MarkDocumentController {
     private MarkPaperService markPaperService;
     @Resource
     private MarkDocumentService markDocumentService;
+    @Resource
+    private MarkStudentService markStudentService;
+    @Resource
+    private ScanPackageService scanPackageService;
 
     @ApiOperation(value = "文档管理列表")
     @RequestMapping(value = "/list", method = RequestMethod.POST)
@@ -77,6 +89,29 @@ public class MarkDocumentController {
 
     @ApiOperation(value = "文档下载")
     @RequestMapping(value = "/download", method = RequestMethod.POST)
-    public void download(@ApiParam(value = "文档ID", required = true) Long id) {
+    public void download(@ApiParam(value = "文档ID", required = true) Long id, HttpServletResponse response) {
+        MarkDocument document = markDocumentService.getById(id);
+        if(document==null){
+            throw ExceptionResultEnum.ERROR.exception("文档不存在");
+        }
+        if(document.getType().equals(DocumentType.SCORE)){
+            ArchiveStudentQuery query = new ArchiveStudentQuery();
+            query.setExamId(document.getExamId());
+            query.setPaperNumber(document.getPaperNumber());
+            markStudentService.scoreExport(query, response);
+        }
+        MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(document.getExamId(),document.getPaperNumber());
+        if(markPaper==null){
+            throw ExceptionResultEnum.ERROR.exception("试卷不存在");
+        }
+        if(document.getType().equals(DocumentType.SHEET)){
+            markStudentService.sheetExport(document.getExamId(),markPaper.getCoursePaperId(),response);
+        }
+        if(document.getType().equals(DocumentType.TRACK)){
+            markStudentService.trackExport(document.getExamId(),markPaper.getCoursePaperId(),response);
+        }
+        if(document.getType().equals(DocumentType.SIGN)){
+            scanPackageService.export(markPaper.getExamId(),markPaper.getCoursePaperId(),response);
+        }
     }
 }

+ 8 - 8
distributed-print/src/main/resources/application.properties

@@ -12,9 +12,9 @@ spring.application.name=teachcloud
 #\u6570\u636E\u6E90\u914D\u7F6E
 db.host=localhost
 db.port=3306
-db.name=teachcloud-v3.3.1
+db.name=teachcloud_db_dev
 db.username=root
-db.password=123456789
+db.password=12345678
 
 #redis\u6570\u636E\u6E90\u914D\u7F6E
 com.qmth.redis.host=${db.host}
@@ -47,19 +47,19 @@ spring.activiti.check-process-definitions=false
 #full\uFF1A\u4FDD\u5B58\u5386\u53F2\u6570\u636E\u7684\u6700\u9AD8\u7EA7\u522B\uFF0C\u9664\u4E86\u4F1A\u4FDD\u5B58audit\u7EA7\u522B\u7684\u6570\u636E\u5916\uFF0C\u8FD8\u4F1A\u4FDD\u5B58\u5176\u4ED6\u5168\u90E8\u6D41\u7A0B\u76F8\u5173\u7684\u7EC6\u8282\u6570\u636E\uFF0C\u5305\u62EC\u4E00\u4E9B\u6D41\u7A0B\u53C2\u6570\u7B49\u3002
 spring.activiti.history-level=audit
 
-#com.qmth.fss.public.config=oss://key:secret@teachcloud-dps-dev1-public.oss-api.qmth.com.cn
-#com.qmth.fss.public.server=https://oss-file.qmth.com.cn/teachcloud-dps-dev1-public
-#com.qmth.fss.private.config=oss://key:secret@teachcloud-dps-dev1-private.oss-api.qmth.com.cn
-#com.qmth.fss.private.server=https://oss-file.qmth.com.cn/teachcloud-dps-dev1-private
+#com.qmth.fss.public.config=oss://key:secret@teachcloud-dps-dev-public.oss-api.qmth.com.cn
+#com.qmth.fss.public.server=https://oss-file.qmth.com.cn/teachcloud-dps-dev-public
+#com.qmth.fss.private.config=oss://key:secret@teachcloud-dps-dev-private.oss-api.qmth.com.cn
+#com.qmth.fss.private.server=https://oss-file.qmth.com.cn/teachcloud-dps-dev-private
 
 #com.qmth.fss.public.config=/Users/xiaofei/qmth/temporary/zxzk/file-temp
 #com.qmth.fss.public.server=http://localhost:7001
 #com.qmth.fss.private.config=/Users/xiaofei/qmth/temporary/zxzk/pdf-temp
 #com.qmth.fss.private.server=http://localhost:7001
 
-com.qmth.fss.public.config=/Users/king/Downloads/file-temp
+com.qmth.fss.public.config=/Users/yin/Downloads/file-temp
 com.qmth.fss.public.server=/file-temp/
-com.qmth.fss.private.config=/Users/king/Downloads/pdf-temp
+com.qmth.fss.private.config=/Users/yin/Downloads/pdf-temp
 com.qmth.fss.private.server=/pdf-temp/
 
 #\u7CFB\u7EDF\u914D\u7F6E

+ 3 - 2
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/FileUploadServiceImpl.java

@@ -325,10 +325,11 @@ public class FileUploadServiceImpl implements FileUploadService {
     }
     public void uploadFile(boolean oss, UploadFileEnum uploadFileEnum, String uploadFileName, InputStream in) throws Exception {
         FileStoreUtil fileStoreUtil = SpringContextHolder.getBean(FileStoreUtil.class);
+        InputStream inputStream = in;
         if (isOssUpload(oss, uploadFileEnum)) {
-            fileStoreUtil.ossUpload(uploadFileName, in, DigestUtils.md5Hex(in), fileStoreUtil.getUploadEnumByPath(uploadFileName).getFssType());
+            fileStoreUtil.ossUpload(uploadFileName, in, DigestUtils.md5Hex(inputStream), fileStoreUtil.getUploadEnumByPath(uploadFileName).getFssType());
         } else {
-            fileStoreUtil.localUpload(uploadFileName, in, DigestUtils.md5Hex(in), LocalCatalogEnum.LOCAL_PDF);
+            fileStoreUtil.localUpload(uploadFileName, in, DigestUtils.md5Hex(inputStream), LocalCatalogEnum.LOCAL_PDF);
         }
     }
 

+ 5 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkFileService.java

@@ -24,4 +24,9 @@ public interface MarkFileService {
 	String getScanLogUri(String schoolCode, String deviceCode, String fileName);
 
 	String uploadScanLog(InputStream in, String md5, String schoolCode, String deviceCode, String fileName);
+	String getDocumentUri(Long examId, String paperNumber, String documentType,
+						  String fileName,String format);
+
+	String uploadDocument(InputStream in, String md5, Long examId, String paperNumber, String documentType,
+						  String fileName,String format) ;
 }

+ 4 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkStudentService.java

@@ -151,4 +151,8 @@ public interface MarkStudentService extends IService<MarkStudent> {
     void updateStudentAnswer(@NotNull Long studentId);
 
     List<MarkStudentScoreVo> listMarkStudentScoreList(Long examId, String paperNumber);
+
+    void trackExport(Long examId, String paperNumber, HttpServletResponse response);
+
+    void sheetExport(Long examId, String paperNumber, HttpServletResponse response);
 }

+ 5 - 2
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/ScanPackageService.java

@@ -2,12 +2,14 @@ package com.qmth.teachcloud.mark.service;
 
 import java.util.List;
 
-import com.qmth.teachcloud.common.bean.dto.DataPermissionRule;
-import com.qmth.teachcloud.common.enums.mark.MarkPaperStatus;
+import javax.servlet.http.HttpServletResponse;
+
 import org.springframework.web.multipart.MultipartFile;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.teachcloud.common.bean.dto.DataPermissionRule;
+import com.qmth.teachcloud.common.enums.mark.MarkPaperStatus;
 import com.qmth.teachcloud.mark.bean.scananswer.SheetUploadVo;
 import com.qmth.teachcloud.mark.bean.scanpackage.ScanPackageFindVo;
 import com.qmth.teachcloud.mark.bean.scanpackage.ScanPackageQuery;
@@ -36,4 +38,5 @@ public interface ScanPackageService extends IService<ScanPackage> {
 
 	List<String> imageGet(Long examId, String coursePaperId, String packageCode);
 
+    void export(Long examId, String coursePaperId, HttpServletResponse response);
 }

+ 18 - 22
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkDocumentServiceImpl.java

@@ -15,19 +15,16 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.boot.core.exception.ParameterException;
-import com.qmth.teachcloud.common.bean.vo.FilePathVo;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
-import com.qmth.teachcloud.common.enums.UploadFileEnum;
 import com.qmth.teachcloud.common.enums.mark.MarkPaperStatus;
-import com.qmth.teachcloud.common.service.FileUploadService;
 import com.qmth.teachcloud.common.service.TeachcloudCommonService;
-import com.qmth.teachcloud.common.util.FileStoreUtil;
 import com.qmth.teachcloud.mark.entity.MarkDocument;
 import com.qmth.teachcloud.mark.entity.MarkPaper;
 import com.qmth.teachcloud.mark.enums.DocumentType;
 import com.qmth.teachcloud.mark.mapper.MarkDocumentMapper;
 import com.qmth.teachcloud.mark.service.MarkDocumentService;
+import com.qmth.teachcloud.mark.service.MarkFileService;
 import com.qmth.teachcloud.mark.service.MarkPaperService;
 
 /**
@@ -41,20 +38,23 @@ import com.qmth.teachcloud.mark.service.MarkPaperService;
 @Service
 public class MarkDocumentServiceImpl extends ServiceImpl<MarkDocumentMapper, MarkDocument> implements MarkDocumentService {
     @Resource
-    private FileUploadService fileUploadService;
-    @Resource
-    private FileStoreUtil fileStoreUtil;
+    private MarkFileService markFileService;
     @Resource
     private TeachcloudCommonService teachcloudCommonService;
 
     @Resource
     private MarkPaperService markPaperService;
+
     @Override
     public List<MarkDocument> listByExamIdAndPaperNumber(Long examId, String paperNumber) {
         QueryWrapper<MarkDocument> queryWrapper = new QueryWrapper<>();
         queryWrapper.lambda().eq(MarkDocument::getExamId, examId)
                 .eq(MarkDocument::getPaperNumber, paperNumber);
-        return this.list(queryWrapper);
+        List<MarkDocument> list = this.list(queryWrapper);
+        for (MarkDocument d:list) {
+            d.setFilePath(teachcloudCommonService.filePreview(d.getFilePath()));
+        }
+        return list;
     }
 
     @Override
@@ -78,14 +78,14 @@ public class MarkDocumentServiceImpl extends ServiceImpl<MarkDocumentMapper, Mar
             if(document.getType().equals(DocumentType.CUSTOM)){
                 name = document.getName();
             }
-            String filePath = getDocumentUri(document.getExamId(),document.getPaperNumber(),String.valueOf(document.getType().getValue()),name,format);
-            FilePathVo vo = fileUploadService.uploadFile(file.getInputStream(),filePath ,UploadFileEnum.DOCUMENT);
+            String path = markFileService.uploadDocument(file.getInputStream(),
+                    md5,document.getExamId(),document.getPaperNumber(),String.valueOf(document.getType().getValue()),document.getName(),format);
             UpdateWrapper<MarkDocument> updateWrapper = new UpdateWrapper<>();
-            updateWrapper.lambda().set(MarkDocument::getFilePath, vo.getPath())
+            updateWrapper.lambda().set(MarkDocument::getFilePath, path)
                     .set(MarkDocument::getFileCount, 1)
                     .eq(MarkDocument::getId, id);
             this.update(updateWrapper);
-            return teachcloudCommonService.filePreview(vo.getPath());
+            return teachcloudCommonService.filePreview(path);
         } catch (IOException e) {
             log.error(SystemConstant.LOG_ERROR, e);
             throw new ParameterException("原图上传失败", e);
@@ -107,7 +107,7 @@ public class MarkDocumentServiceImpl extends ServiceImpl<MarkDocumentMapper, Mar
     @Override
     public String save(Long examId, String paperNumber, String documentName, MultipartFile file, String md5) {
         MarkPaper markPaper=markPaperService.getByExamIdAndPaperNumber(examId,paperNumber);
-        if(markPaper==null ||markPaper.getStatus().equals(MarkPaperStatus.FINISH)){
+        if(markPaper==null || !markPaper.getStatus().equals(MarkPaperStatus.FINISH)){
             throw ExceptionResultEnum.ERROR.exception("评卷未结束或试卷不存在");
         }
         QueryWrapper<MarkDocument> queryWrapper = new QueryWrapper<>();
@@ -116,7 +116,7 @@ public class MarkDocumentServiceImpl extends ServiceImpl<MarkDocumentMapper, Mar
                 .eq(MarkDocument::getName, documentName);
         MarkDocument document = this.getOne(queryWrapper);
         if(document!=null){
-            throw ExceptionResultEnum.ERROR.exception(document+"已存在");
+            throw ExceptionResultEnum.ERROR.exception(documentName+"已存在");
         }
         document = new MarkDocument();
         document.setExamId(examId);
@@ -136,18 +136,14 @@ public class MarkDocumentServiceImpl extends ServiceImpl<MarkDocumentMapper, Mar
             if(document.getType().equals(DocumentType.CUSTOM)){
                 name = document.getName();
             }
-            String filePath = getDocumentUri(document.getExamId(),document.getPaperNumber(),String.valueOf(document.getType().getValue()),name,format);
-            FilePathVo vo = fileUploadService.uploadFile(file.getInputStream(),filePath ,UploadFileEnum.DOCUMENT);
-            document.setFilePath(vo.getPath());
+            String path = markFileService.uploadDocument(file.getInputStream(),
+                    md5,examId,paperNumber,String.valueOf(document.getType().getValue()),documentName,format);
+            document.setFilePath(path);
             this.save(document);
-            return teachcloudCommonService.filePreview(vo.getPath());
+            return teachcloudCommonService.filePreview(path);
         } catch (IOException e) {
             log.error(SystemConstant.LOG_ERROR, e);
             throw new ParameterException("文件上传失败", e);
         }
     }
-
-    public String getDocumentUri(Long examId, String paperNumber, String documentType, String no,String format) {
-        return UploadFileEnum.DOCUMENT.getPath(UploadFileEnum.DOCUMENT.getTitle(), examId, paperNumber, documentType, no, format.toLowerCase());
-    }
 }

+ 25 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkFileServiceImpl.java

@@ -138,4 +138,29 @@ public class MarkFileServiceImpl implements MarkFileService {
             }
         }
     }
+
+    @Override
+    public String getDocumentUri(Long examId, String paperNumber, String documentType, String fileName,String format) {
+        return UploadFileEnum.DOCUMENT.getPath(UploadFileEnum.DOCUMENT.getTitle(),examId, paperNumber, documentType, fileName, format.toLowerCase());
+    }
+
+    @Override
+    public String uploadDocument(InputStream in, String md5, Long examId, String paperNumber, String documentType,
+                                String fileName,String format) {
+        String path = getDocumentUri(examId, paperNumber, documentType, fileName,format);
+        try {
+            return fileStoreUtils.uploadFile(in, md5, UploadFileEnum.DOCUMENT, path);
+        } catch (RuntimeException e) {
+            throw e;
+        } catch (Exception e) {
+            throw new StatusException("文件上传出错:" + path, e);
+        } finally {
+            if (in != null) {
+                try {
+                    in.close();
+                } catch (IOException e) {
+                }
+            }
+        }
+    }
 }

+ 67 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkStudentServiceImpl.java

@@ -1,5 +1,6 @@
 package com.qmth.teachcloud.mark.service.impl;
 
+import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.net.URLEncoder;
 import java.nio.charset.StandardCharsets;
@@ -12,6 +13,7 @@ import javax.servlet.http.HttpServletResponse;
 import javax.validation.constraints.NotNull;
 
 import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.io.FilenameUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -31,6 +33,7 @@ import com.qmth.boot.core.concurrent.service.ConcurrentService;
 import com.qmth.boot.core.exception.ParameterException;
 import com.qmth.boot.tools.excel.ExcelWriter;
 import com.qmth.boot.tools.excel.enums.ExcelType;
+import com.qmth.boot.tools.io.ZipWriter;
 import com.qmth.teachcloud.common.bean.dto.DataPermissionRule;
 import com.qmth.teachcloud.common.bean.vo.FilePathVo;
 import com.qmth.teachcloud.common.contant.SystemConstant;
@@ -43,6 +46,7 @@ import com.qmth.teachcloud.common.enums.ScanStatus;
 import com.qmth.teachcloud.common.enums.mark.MarkPaperStatus;
 import com.qmth.teachcloud.common.enums.mark.SubjectiveStatus;
 import com.qmth.teachcloud.common.service.BasicRoleDataPermissionService;
+import com.qmth.teachcloud.common.service.FileUploadService;
 import com.qmth.teachcloud.common.service.TeachcloudCommonService;
 import com.qmth.teachcloud.common.util.*;
 import com.qmth.teachcloud.mark.bean.UpdateTimeVo;
@@ -135,6 +139,9 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
     @Resource
     private MarkSyncService markSyncService;
 
+    @Resource
+    private FileUploadService fileUploadService;
+
     @Override
     public List<String> listClassByExamIdAndCourseCode(Long examId, String paperNumber) {
         QueryWrapper<MarkStudent> queryWrapper = new QueryWrapper<>();
@@ -1380,4 +1387,64 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
         }
         return markStudentScoreVoList;
     }
+
+    @Override
+    public void trackExport(Long examId, String coursePaperId, HttpServletResponse response) {
+        {
+            List<MarkStudent> list = this.listByExamIdAndCoursePaperId(examId,coursePaperId);
+            if (CollectionUtils.isNotEmpty(list)) {
+                try {
+                    response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("轨迹图.zip","UTF-8"));
+                    ZipWriter writer = ZipWriter.create(response.getOutputStream());
+                    ByteArrayOutputStream os = new ByteArrayOutputStream();
+                    for (MarkStudent s:list) {
+                        if(!s.getUpload()){
+                            continue;
+                        }
+                        List<FilePathVo> vos = JSON.parseArray(s.getSheetPath(), FilePathVo.class);
+                        for (int i = 0; i < vos.size(); i++) {
+                            FilePathVo vo = vos.get(i);
+                            File file =  fileUploadService.downloadFile( JSON.toJSONString(vo),vo.getPath());
+                            String format = FilenameUtils.getExtension(file.getName());
+                            writer.write(file, s.getStudentCode()+"-"+(i+1)+"."+format);
+                            file.delete();
+                        }
+                    }
+                    writer.close();
+                }catch (Exception e){
+                    e.printStackTrace();
+                    throw new ParameterException("文件下载失败", e);
+                }
+            }
+        }
+    }
+
+    @Override
+    public void sheetExport(Long examId, String coursePaperId, HttpServletResponse response) {
+        List<MarkStudent> list = this.listByExamIdAndCoursePaperId(examId,coursePaperId);
+        if (CollectionUtils.isNotEmpty(list)) {
+            try {
+                response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("原图.zip","UTF-8"));
+                ZipWriter writer = ZipWriter.create(response.getOutputStream());
+                ByteArrayOutputStream os = new ByteArrayOutputStream();
+                for (MarkStudent s:list) {
+                    if(!s.getUpload()){
+                        continue;
+                    }
+                    List<FilePathVo> vos = JSON.parseArray(s.getSheetPath(), FilePathVo.class);
+                    for (int i = 0; i < vos.size(); i++) {
+                        FilePathVo vo = vos.get(i);
+                        File file =  fileUploadService.downloadFile(JSON.toJSONString(vo),vo.getPath());
+                        String format = FilenameUtils.getExtension(file.getName());
+                        writer.write(file, s.getStudentCode()+"-"+(i+1)+"."+format);
+                        file.delete();
+                    }
+                }
+                writer.close();
+            }catch (Exception e){
+                e.printStackTrace();
+                throw new ParameterException("文件下载失败", e);
+            }
+        }
+    }
 }

+ 52 - 13
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/ScanPackageServiceImpl.java

@@ -1,16 +1,39 @@
 package com.qmth.teachcloud.mark.service.impl;
 
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.boot.core.exception.ParameterException;
+import com.qmth.boot.tools.io.ZipWriter;
 import com.qmth.teachcloud.common.bean.dto.DataPermissionRule;
+import com.qmth.teachcloud.common.bean.vo.FilePathVo;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.mark.MarkPaperStatus;
 import com.qmth.teachcloud.common.service.BasicRoleDataPermissionService;
+import com.qmth.teachcloud.common.service.FileUploadService;
 import com.qmth.teachcloud.common.service.TeachcloudCommonService;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import com.qmth.teachcloud.mark.bean.scananswer.SheetUploadVo;
@@ -21,19 +44,6 @@ import com.qmth.teachcloud.mark.entity.MarkPaperPackage;
 import com.qmth.teachcloud.mark.entity.ScanPackage;
 import com.qmth.teachcloud.mark.mapper.ScanPackageMapper;
 import com.qmth.teachcloud.mark.service.*;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.web.multipart.MultipartFile;
-
-import javax.annotation.Resource;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -57,6 +67,8 @@ public class ScanPackageServiceImpl extends ServiceImpl<ScanPackageMapper, ScanP
     private TeachcloudCommonService teachcloudCommonService;
     @Resource
     private BasicRoleDataPermissionService basicRoleDataPermissionService;
+    @Resource
+    private FileUploadService fileUploadService;
 
     @Override
     public int getCount(Long examId, String courseCode, String coursePaperId, MarkPaperStatus status, DataPermissionRule dpr) {
@@ -200,4 +212,31 @@ public class ScanPackageServiceImpl extends ServiceImpl<ScanPackageMapper, ScanP
         }
         return ret;
     }
+
+    @Override
+    public void export(Long examId, String coursePaperId, HttpServletResponse response) {
+        QueryWrapper<ScanPackage> wrapper = new QueryWrapper<>();
+        LambdaQueryWrapper<ScanPackage> lw = wrapper.lambda();
+        lw.eq(ScanPackage::getExamId, examId);
+        lw.eq(ScanPackage::getCoursePaperId, coursePaperId);
+        lw.orderByAsc(ScanPackage::getPackageNo);
+        List<ScanPackage> list = this.list(wrapper);
+        if (CollectionUtils.isNotEmpty(list)) {
+            try {
+                response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("签到表.zip","UTF-8"));
+                ZipWriter writer = ZipWriter.create(response.getOutputStream());
+                ByteArrayOutputStream os = new ByteArrayOutputStream();
+                for (ScanPackage s: list) {
+                    FilePathVo filePathVo = JSON.parseObject(s.getPath(), FilePathVo.class);
+                    File file =  fileUploadService.downloadFile(s.getPath(),filePathVo.getPath());
+                    writer.write(file, file.getName());
+                    file.delete();
+                }
+                writer.close();
+            }catch (Exception e){
+                e.printStackTrace();
+                throw new ParameterException("文件下载失败", e);
+            }
+        }
+    }
 }