xiaof 4 anni fa
parent
commit
d0f7d5d140

+ 18 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/CommonService.java

@@ -3,11 +3,14 @@ package com.qmth.distributed.print.business.service;
 import com.qmth.distributed.print.business.bean.auth.AuthBean;
 import com.qmth.distributed.print.business.bean.dto.PrivilegeCacheDto;
 import com.qmth.distributed.print.business.bean.result.RolePrivilegeResult;
+import com.qmth.distributed.print.business.entity.BasicAttachment;
 import com.qmth.distributed.print.business.entity.SysRolePrivilege;
 import com.qmth.distributed.print.business.entity.SysUser;
 import com.qmth.distributed.print.business.entity.SysUserRole;
 import com.qmth.distributed.print.business.enums.PrivilegePropertyEnum;
 
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
 import java.security.NoSuchAlgorithmException;
 import java.util.List;
 
@@ -97,4 +100,19 @@ public interface CommonService {
      * @return
      */
     public String readFileContent(String path);
+
+    /**
+     * 下载文件到本地
+     * @param rootPath 保存目录
+     * @param attachment 附件表对象
+     * @return
+     */
+    public File copyFile(String rootPath, BasicAttachment attachment);
+
+    /**
+     * 下载文件到本地并压缩返回
+     * @param filePath 文件根目录
+     * @param files 需要下载的文件集合
+     */
+    public void downloadFileAndZip(HttpServletResponse response, String filePath, List<File> files);
 }

+ 2 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamTaskService.java

@@ -10,6 +10,7 @@ import com.qmth.distributed.print.business.entity.ExamTaskReviewLog;
 import com.qmth.distributed.print.business.enums.ExamStatusEnum;
 import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.http.HttpServletResponse;
 import java.util.List;
 import java.util.Map;
 
@@ -83,4 +84,5 @@ public interface ExamTaskService extends IService<ExamTask> {
      */
     IPage<WorkResult> queryByMyWorkSubmit(IPage<Map> iPage, Long userId, Long schoolId, ExamStatusEnum status);
 
+    void paperDownload(HttpServletResponse response, Long examTaskId);
 }

+ 89 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/CommonServiceImpl.java

@@ -1,5 +1,7 @@
 package com.qmth.distributed.print.business.service.impl;
 
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.util.ZipUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -28,6 +30,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.util.LinkedMultiValueMap;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
 import java.io.*;
 import java.security.NoSuchAlgorithmException;
 import java.util.*;
@@ -326,7 +329,7 @@ public class CommonServiceImpl implements CommonService {
         JSONObject object = JSONObject.parseObject(path);
         String filePath = object.getString(SystemConstant.PATH);
         String type = object.getString(SystemConstant.TYPE);
-        if(filePath.endsWith(".html")) {
+        if (filePath.endsWith(".html")) {
             StringBuffer sb = new StringBuffer();
             try {
                 InputStream fis;
@@ -353,4 +356,89 @@ public class CommonServiceImpl implements CommonService {
         }
         return null;
     }
+
+    @Override
+    public File copyFile(String rootPath, BasicAttachment attachment) {
+        JSONObject object = JSONObject.parseObject(attachment.getPath());
+        String filePath = object.getString(SystemConstant.PATH);
+        String type = object.getString(SystemConstant.TYPE);
+        if (type.equals(SystemConstant.OSS)) {
+            File localPath = new File(rootPath, attachment.getName() + attachment.getType());
+            try {
+                File file = ossUtil.ossDownload(filePath, localPath.getPath());
+                return file;
+            } catch (IOException e) {
+                throw ExceptionResultEnum.ERROR.exception("从OSS上下载文件失败");
+            }
+        } else {
+            File file = new File(filePath);
+            if (!file.exists()) {
+                throw ExceptionResultEnum.ERROR.exception("本地文件不存在");
+            }
+            return file;
+        }
+    }
+
+    @Override
+    public void downloadFileAndZip(HttpServletResponse response, String rootPath, List<File> files) {
+        String schoolId = ServletUtil.getRequestHeaderSchoolId().toString();
+        long time = System.nanoTime();
+        File rootFile = new File(rootPath);
+        // 创建保存目录
+        if (!rootFile.exists()) {
+            rootFile.mkdirs();
+        }
+        File zipFile = null;
+        try {
+            zipFile = FileUtil.file(SystemConstant.DOWNLOAD_TEMP + File.separator + schoolId, time + ".zip");
+            // 压缩文件
+            if (!zipFile.exists()) {
+                zipFile.createNewFile();
+            }
+            File[] srcFiles = files.toArray(new File[files.size()]);
+//            ZipUtil.zip(rootFile.getAbsolutePath(), zipFile.getAbsolutePath(), false);
+
+            ZipUtil.zip(zipFile, false, srcFiles);
+            outputFile(response, zipFile, String.valueOf(time));
+        } catch (Exception e) {
+            throw ExceptionResultEnum.ERROR.exception("下载失败");
+        } finally {
+            // 删除zip文件
+            FileUtil.del(zipFile);
+            // 删除压缩内容
+            FileUtil.del(rootPath);
+        }
+    }
+
+    public static void outputFile(HttpServletResponse response, File file, String fileName) {
+        try {
+
+            if (!file.exists()) {
+                response.sendError(404, "File not found!");
+            }
+
+            BufferedInputStream br = new BufferedInputStream(new FileInputStream(file));
+            byte[] buf = new byte[1024];
+            int len = 0;
+
+            String fName = new String(fileName.getBytes(), "ISO-8859-1");
+
+            response.reset();
+            response.setContentType("application/x-msdownload");
+            response.setHeader("Content-Disposition", "attachment; filename=" + fName);
+
+            OutputStream outStream = response.getOutputStream();
+
+            while ((len = br.read(buf)) > 0) {
+                outStream.write(buf, 0, len);
+            }
+
+            br.close();
+            outStream.close();
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
 }

+ 47 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskServiceImpl.java

@@ -1,5 +1,6 @@
 package com.qmth.distributed.print.business.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -13,6 +14,7 @@ import com.qmth.distributed.print.business.enums.ReviewStatusEnum;
 import com.qmth.distributed.print.business.mapper.ExamTaskMapper;
 import com.qmth.distributed.print.business.service.*;
 import com.qmth.distributed.print.business.util.ServletUtil;
+import com.qmth.distributed.print.common.contant.SystemConstant;
 import com.qmth.distributed.print.common.enums.ExceptionResultEnum;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -21,6 +23,8 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -47,6 +51,12 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
     @Autowired
     private ExamTaskDetailService examTaskDetailService;
 
+    @Autowired
+    private BasicAttachmentService basicAttachmentService;
+
+    @Autowired
+    private CommonService commonService;
+
     @Resource
     ExamTaskMapper examTaskMapper;
 
@@ -416,4 +426,41 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
     public IPage<WorkResult> queryByMyWorkSubmit(IPage<Map> iPage, Long userId, Long schoolId, ExamStatusEnum status) {
         return examTaskMapper.queryByMyWorkSubmit(iPage, userId, schoolId, Objects.nonNull(status) ? status.name() : null);
     }
+
+    @Override
+    public void paperDownload(HttpServletResponse response, Long examTaskId) {
+        String schoolId = ServletUtil.getRequestHeaderSchoolId().toString();
+        QueryWrapper<ExamTaskDetail> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(ExamTaskDetail::getExamTaskId, examTaskId);
+        ExamTaskDetail examTaskDetail = examTaskDetailService.getOne(queryWrapper);
+        if(examTaskDetail == null){
+            throw ExceptionResultEnum.ERROR.exception("数据异常");
+        }
+        String paperAttachmentIds = examTaskDetail.getPaperAttachmentIds();
+        List<JSONObject> jsonObjectList = JSONObject.parseArray(paperAttachmentIds, JSONObject.class);
+        // 本地保存目录
+        String rootPath = SystemConstant.DOWNLOAD_TEMP + File.separator + schoolId + File.separator+ examTaskDetail.getId();
+        List<File> fileList = new ArrayList<>();
+        // 试卷
+        for (JSONObject jsonObject : jsonObjectList) {
+            Long id = jsonObject.getLongValue("attachmentId");
+            BasicAttachment attachment = basicAttachmentService.getById(id);
+            if(attachment == null){
+                throw ExceptionResultEnum.ERROR.exception("附件数据异常");
+            }
+            File file = commonService.copyFile(rootPath, attachment);
+            fileList.add(file);
+        }
+
+        // 题卡 todo
+//        Long cardId = examTaskDetail.getCardId();
+//        if (cardId != null){
+//
+//        }
+        if(fileList.size() == 0){
+            throw ExceptionResultEnum.ERROR.exception("没有可导出文件");
+        }
+
+        commonService.downloadFileAndZip(response, rootPath, fileList);
+    }
 }

+ 1 - 0
distributed-print-common/src/main/java/com/qmth/distributed/print/common/contant/SystemConstant.java

@@ -28,6 +28,7 @@ public class SystemConstant {
     public static final String USER_DIR = "user.dir";
     public static final String PDF_TEMP = "pdf-temp";
     public static final String FILE_TEMP = "file-temp";
+    public static final String DOWNLOAD_TEMP = "download-temp";
     public static final String SESSION = "session:";
     public static final String TASK = "task";
     public static final String USER = "account";

+ 8 - 9
distributed-print/src/main/java/com/qmth/distributed/print/api/ExamTaskController.java

@@ -21,6 +21,7 @@ import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import java.util.List;
 
 /**
@@ -368,18 +369,16 @@ public class ExamTaskController {
         return ResultUtil.ok(examTaskDtoIPage);
     }
 
-    @ApiOperation(value = "预览")
-    @RequestMapping(value = "/paper_preview", method = RequestMethod.POST)
-    public Result taskPaperPreview(HttpServletRequest request) {
-        // todo 预览
-        return ResultUtil.ok(true);
-    }
 
+    /**
+     * 下载
+     * @param response
+     * @param examTaskId
+     */
     @ApiOperation(value = "下载")
     @RequestMapping(value = "/paper_download", method = RequestMethod.POST)
-    public Result taskPaperDownload(HttpServletRequest request) {
-        // todo 预览
-        return ResultUtil.ok(true);
+    public void taskPaperDownload(HttpServletResponse response, @RequestParam Long examTaskId) {
+        examTaskService.paperDownload(response, examTaskId);
     }
 
     /**