xiaofei 1 год назад
Родитель
Сommit
d804bcdc57
21 измененных файлов с 426 добавлено и 553 удалено
  1. 31 14
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/ExamTaskPaperData.java
  2. 3 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamCardService.java
  3. 2 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamTaskPaperDataService.java
  4. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamTaskService.java
  5. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/DownloadServiceImpl.java
  6. 60 56
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamCardServiceImpl.java
  7. 76 57
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskServiceImpl.java
  8. 3 3
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/impl/TaskLogicServiceImpl.java
  9. 1 2
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/util/CreatePdfUtil.java
  10. 6 105
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/util/HtmlToJpgUtil.java
  11. 8 41
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/util/pdf/CreatePdfNewUtil.java
  12. 0 59
      distributed-print-business/src/main/resources/db/log/脚本-caozx.sql
  13. 3 2
      distributed-print-business/src/main/resources/mapper/ExamTaskPaperDataMapper.xml
  14. 65 2
      distributed-print/install/mysql/upgrade/3.3.1.sql
  15. 15 2
      distributed-print/src/main/java/com/qmth/distributed/print/api/ExamCardController.java
  16. 4 3
      distributed-print/src/main/java/com/qmth/distributed/print/api/ExamTaskApplyController.java
  17. 18 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/vo/PaperInfoVo.java
  18. 21 24
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/contant/SystemConstant.java
  19. 63 95
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/TeachcloudCommonService.java
  20. 3 84
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/TeachcloudCommonServiceImpl.java
  21. 42 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/util/FileUtil.java

+ 31 - 14
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/ExamTaskPaperData.java

@@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import java.io.Serializable;
 
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import com.github.jeffreyning.mybatisplus.anno.MppMultiId;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -23,6 +25,7 @@ public class ExamTaskPaperData implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
+    @JsonSerialize(using = ToStringSerializer.class)
     @ApiModelProperty(value = "考试ID")
     @MppMultiId(value = "exam_id")
     private Long examId;
@@ -31,6 +34,7 @@ public class ExamTaskPaperData implements Serializable {
     @MppMultiId(value = "paper_number")
     private String paperNumber;
 
+    @JsonSerialize(using = ToStringSerializer.class)
     @ApiModelProperty(value = "题库试卷ID")
     @MppMultiId(value = "paper_id")
     private Long paperId;
@@ -44,15 +48,26 @@ public class ExamTaskPaperData implements Serializable {
     @ApiModelProperty(value = "试卷答案内容(从answer.json解析)")
     private String answerJson;
 
-    @ApiModelProperty(value = "试卷pdf文件地址(paper.pdf上传地址)")
-    private String paperPdf;
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "试卷pdf文件地址(paper.pdf上传附件ID)")
+    private Long paperPdfAttachmentId;
 
-    @ApiModelProperty(value = "标答pdf文件地址(answer.pdf上传地址)")
-    private String answerPdf;
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "标答pdf文件地址(answer.pdf上传附件ID)")
+    private Long answerPdfAttachmentId;
 
     @ApiModelProperty(value = "唯一标识")
     private String uuid;
 
+    public ExamTaskPaperData() {
+    }
+
+    public ExamTaskPaperData(Long examId, String paperNumber, Long paperId) {
+        this.examId = examId;
+        this.paperNumber = paperNumber;
+        this.paperId = paperId;
+    }
+
     public Long getExamId() {
         return examId;
     }
@@ -95,19 +110,21 @@ public class ExamTaskPaperData implements Serializable {
     public void setAnswerJson(String answerJson) {
         this.answerJson = answerJson;
     }
-    public String getPaperPdf() {
-        return paperPdf;
+
+    public Long getPaperPdfAttachmentId() {
+        return paperPdfAttachmentId;
     }
 
-    public void setPaperPdf(String paperPdf) {
-        this.paperPdf = paperPdf;
+    public void setPaperPdfAttachmentId(Long paperPdfAttachmentId) {
+        this.paperPdfAttachmentId = paperPdfAttachmentId;
     }
-    public String getAnswerPdf() {
-        return answerPdf;
+
+    public Long getAnswerPdfAttachmentId() {
+        return answerPdfAttachmentId;
     }
 
-    public void setAnswerPdf(String answerPdf) {
-        this.answerPdf = answerPdf;
+    public void setAnswerPdfAttachmentId(Long answerPdfAttachmentId) {
+        this.answerPdfAttachmentId = answerPdfAttachmentId;
     }
 
     public String getUuid() {
@@ -127,8 +144,8 @@ public class ExamTaskPaperData implements Serializable {
             ", dataPacketPath=" + dataPacketPath +
             ", paperJson=" + paperJson +
             ", answerJson=" + answerJson +
-            ", paperPdf=" + paperPdf +
-            ", answerPdf=" + answerPdf +
+            ", paperPdfAttachmentId=" + paperPdfAttachmentId +
+            ", answerPdfAttachmentId=" + answerPdfAttachmentId +
         "}";
     }
 }

+ 3 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamCardService.java

@@ -41,9 +41,11 @@ public interface ExamCardService extends IService<ExamCard> {
 
     void convertImage(Long id);
 
-    void cardDownload(HttpServletResponse response, String id);
+    void downloadCard(HttpServletResponse response, String id);
 
     List<CardJpgResult> listCardImage(Long examId, String paperNumber, String paperType);
 
     ExamCard createJpgImage(ExamCard examCard);
+
+    void downloadCardJson(HttpServletResponse response, String id);
 }

+ 2 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamTaskPaperDataService.java

@@ -1,5 +1,6 @@
 package com.qmth.distributed.print.business.service;
 
+import com.github.jeffreyning.mybatisplus.service.IMppService;
 import com.qmth.distributed.print.business.entity.ExamTaskPaperData;
 import com.baomidou.mybatisplus.extension.service.IService;
 
@@ -11,6 +12,6 @@ import com.baomidou.mybatisplus.extension.service.IService;
  * @author xf
  * @since 2024-02-29
  */
-public interface ExamTaskPaperDataService extends IService<ExamTaskPaperData> {
+public interface ExamTaskPaperDataService extends IMppService<ExamTaskPaperData> {
 
 }

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

@@ -216,5 +216,5 @@ public interface ExamTaskService extends IService<ExamTask> {
 
     IPage<TikuPaperInfo> pageTikuPaper(String courseCode, String paperName, String account, Integer pageNumber, Integer pageSize);
 
-    Map<String, String> getTikuPaperData(Long examId, Long paperId);
+    Map<String, Object> getTikuPaperData(Long examId, Long paperId, String uuid);
 }

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

@@ -159,7 +159,7 @@ public class DownloadServiceImpl implements DownloadService {
                         htmlContent = createPdfUtil.resetHtmlTemplateBar(examCard.getHtmlContent());
                     } else {
                         BasicCardRule basicCardRule = basicCardRuleService.getById(examTask.getCardRuleId());
-                        htmlContent = createPdfUtil.replaceHtmlCard(examCard, basicCardRule);
+                        htmlContent = createPdfUtil.replaceHtmlCardAllParams(examCard, basicCardRule);
                     }
 
                     // html

+ 60 - 56
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamCardServiceImpl.java

@@ -11,6 +11,7 @@ import com.qmth.distributed.print.business.bean.marking.CardJpgResult;
 import com.qmth.distributed.print.business.bean.marking.ConvertJpgStorage;
 import com.qmth.distributed.print.business.bean.params.ExamCardParams;
 import com.qmth.distributed.print.business.bean.params.GenericExamCardParams;
+import com.qmth.distributed.print.business.bean.params.TemplateParam;
 import com.qmth.distributed.print.business.entity.*;
 import com.qmth.distributed.print.business.enums.CardStatusEnum;
 import com.qmth.distributed.print.business.enums.CardTypeEnum;
@@ -21,11 +22,8 @@ import com.qmth.distributed.print.business.util.CreatePdfUtil;
 import com.qmth.distributed.print.business.util.HtmlToJpgUtil;
 import com.qmth.distributed.print.business.util.PdfUtil;
 import com.qmth.distributed.print.business.util.pdf.CreatePdfNewUtil;
-import com.qmth.teachcloud.common.bean.vo.FilePathVo;
-import com.qmth.teachcloud.common.enums.UploadFileEnum;
-import com.qmth.teachcloud.common.service.*;
-import com.qmth.teachcloud.common.util.*;
 import com.qmth.teachcloud.common.bean.dto.DataPermissionRule;
+import com.qmth.teachcloud.common.bean.vo.FilePathVo;
 import com.qmth.teachcloud.common.bean.vo.PaperInfoVo;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.BasicAttachment;
@@ -34,6 +32,9 @@ import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.CardCreateMethodEnum;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.enums.PageSizeEnum;
+import com.qmth.teachcloud.common.enums.UploadFileEnum;
+import com.qmth.teachcloud.common.service.*;
+import com.qmth.teachcloud.common.util.*;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
@@ -366,8 +367,7 @@ public class ExamCardServiceImpl extends ServiceImpl<ExamCardMapper, ExamCard> i
         // 复制题卡
         ExamCard copyExamCard = new ExamCard();
         BeanUtils.copyProperties(examCard, copyExamCard);
-        String title = checkTitle(examCard, courseCode);
-        copyExamCard.setTitle(title);
+        copyExamCard.setTitle(checkTitle(examCard, courseCode));
         copyExamCard.insertInfo(requestUser.getId());
         if (CardTypeEnum.GENERIC.equals(examCard.getType()) && CardCreateMethodEnum.STANDARD.equals(examCard.getCreateMethod())) {
             BasicCourse basicCourse = basicCourseService.findByCourseCode(courseCode, requestUser.getSchoolId());
@@ -399,73 +399,50 @@ public class ExamCardServiceImpl extends ServiceImpl<ExamCardMapper, ExamCard> i
     }
 
     @Override
-    public void cardDownload(HttpServletResponse response, String id) {
+    public void downloadCard(HttpServletResponse response, String id) {
         String rootPath = null;
         try {
-            // 本地保存目录
-            File tempFile = SystemConstant.getFileTempDirVar(System.currentTimeMillis() + File.separator + SystemConstant.getNanoId(), SystemConstant.TEMP_PREFIX);
-            rootPath = tempFile.getParent();
-
-            // 删除临时目录中创建的临时文件
-            if (Objects.nonNull(tempFile)) {
-                tempFile.delete();
-            }
-
             // 题卡详细信息
             ExamCard examCard = this.getById(id);
-
-            StringJoiner dirPath = new StringJoiner("");
-            dirPath = dirPath.add(rootPath).add(File.separator).add(examCard.getTitle()).add(File.separator);
-
-            String htmlContent;
-            // 通用模板
-            if (CardTypeEnum.GENERIC.equals(examCard.getType())) {
-                if (CardCreateMethodEnum.UPLOAD.equals(examCard.getCreateMethod())) {
-                    htmlContent = createPdfUtil.resetHtmlTemplateBar(examCard.getHtmlContent());
-                } else {
-                    BasicCardRule basicCardRule = basicCardRuleService.getById(examCard.getCardRuleId());
-                    htmlContent = createPdfUtil.replaceHtmlCard(examCard, basicCardRule);
-                }
-            } else {
-                List<ExamTask> examTasks = examTaskService.getExamTaskByCourseCodeAndCardId(examCard.getSchoolId(), examCard.getCourseCode(), id);
-                BasicCardRule basicCardRule = null;
-                if (!CollectionUtils.isEmpty(examTasks)) {
-                    basicCardRule = basicCardRuleService.getById(examTasks.get(0).getCardRuleId());
-                }
-                htmlContent = createPdfUtil.replaceHtmlCard(examCard, basicCardRule);
+            // 本地保存目录
+            File tempFile = SystemConstant.getFileTempParentDirVar(SystemConstant.TEMP_PREFIX);
+            rootPath = tempFile.getPath() + File.separator + SystemConstant.getNanoId();
+            // 下载文件保存路径(以题卡名称命名)
+            String downloadFilePath = rootPath + File.separator + examCard.getTitle();
+            File downloadPathFile = new File(downloadFilePath);
+            if (!downloadPathFile.exists()) {
+                downloadPathFile.mkdirs();
             }
 
+            // 通用模板
+            String htmlContent = createPdfNewUtil.replaceBlankHtmlContent(examCard.getHtmlContent());
             // html文件
-            String cardHtmlPath = dirPath + examCard.getTitle() + SystemConstant.HTML_PREFIX;
-            File htmlFile = new File(cardHtmlPath);
+            File htmlFile = new File(downloadFilePath, examCard.getTitle() + SystemConstant.HTML_PREFIX);
             if (!htmlFile.exists()) {
-                htmlFile.getParentFile().mkdirs();
                 htmlFile.createNewFile();
             }
             // 生成html文件
-            FileCopyUtils.copy(htmlContent.getBytes(StandardCharsets.UTF_8), htmlFile);
+            FileUtil.writeContent(htmlFile, htmlContent);
 
             // pdf文件
-            String cardPdfPath = dirPath + examCard.getTitle() + SystemConstant.PDF_PREFIX;
-            File pdfFile = new File(cardPdfPath);
+            File pdfFile = new File(downloadFilePath, examCard.getTitle() + SystemConstant.PDF_PREFIX);
             if (!pdfFile.exists()) {
-                pdfFile.getParentFile().mkdirs();
                 pdfFile.createNewFile();
             }
-            HtmlToPdfUtil.convert(cardHtmlPath, cardPdfPath, PageSizeEnum.A3);
+            HtmlToPdfUtil.convert(htmlFile.getPath(), pdfFile.getPath(), PageSizeEnum.A3);
 
             // jpg文件
             String jpgAttachmentIds = examCard.getJpgAttachment();
             if (StringUtils.isNotBlank(jpgAttachmentIds)) {
-                List<JSONObject> jsonObjectList = JSONObject.parseArray(jpgAttachmentIds, JSONObject.class);
-                for (JSONObject jsonObject : jsonObjectList) {
-                    String jpgAttachmentId = jsonObject.get("attachmentId").toString();
-                    String index = jsonObject.get("index").toString();
-                    if (StringUtils.isNotBlank(jpgAttachmentId)) {
+                List<ConvertJpgStorage> jsonObjectList = JSONObject.parseArray(jpgAttachmentIds, ConvertJpgStorage.class);
+                for (ConvertJpgStorage convertJpgStorage : jsonObjectList) {
+                    Long jpgAttachmentId = convertJpgStorage.getAttachmentId();
+                    Integer index = convertJpgStorage.getIndex();
+                    if (jpgAttachmentId != null) {
                         BasicAttachment attachment = basicAttachmentService.getById(jpgAttachmentId);
                         if (attachment != null) {
-                            String fileName = examCard.getTitle() + SystemConstant.HYPHEN + index + attachment.getType();
-                            teachcloudCommonService.copyFile(dirPath.toString(), fileName, attachment);
+                            String fileName = downloadFilePath + File.separator + examCard.getTitle() + SystemConstant.HYPHEN + index + attachment.getType();
+                            fileUploadService.downloadFile(attachment.getPath(), fileName);
                         }
                     }
                 }
@@ -474,17 +451,18 @@ public class ExamCardServiceImpl extends ServiceImpl<ExamCardMapper, ExamCard> i
             // json文件
             String content = examCard.getContent();
             if (StringUtils.isNotBlank(content)) {
-                String jsonPath = dirPath + examCard.getTitle() + SystemConstant.JSON_PREFIX;
-                SystemConstant.createJsonFile(jsonPath, content);
+                String jsonPath = downloadFilePath + File.separator + examCard.getTitle() + SystemConstant.JSON_PREFIX;
+                FileUtil.writeContent(new File(jsonPath), content);
             }
 
-            String zipFileName = id + SystemConstant.ZIP_PREFIX;
-            teachcloudCommonService.downloadFileAndZip(response, rootPath, rootPath, zipFileName);
+            String zipFileName = examCard.getTitle() + SystemConstant.ZIP_PREFIX;
+//            teachcloudCommonService.downloadFileAndZip(response, rootPath, rootPath, zipFileName);
+            FileUtil.downloadEncryptZip(response, downloadPathFile, zipFileName);
         } catch (Exception e) {
             e.printStackTrace();
         } finally {
             if (Objects.nonNull(rootPath)) {
-                ConvertUtil.delFolder(rootPath);
+                FileUtil.deleteDirectory(rootPath);
             }
         }
     }
@@ -621,4 +599,30 @@ public class ExamCardServiceImpl extends ServiceImpl<ExamCardMapper, ExamCard> i
         }
         return examCard;
     }
+
+    @Override
+    public void downloadCardJson(HttpServletResponse response, String id) {
+        File tempParentFile = null;
+        try {
+            // 题卡详细信息
+            ExamCard examCard = this.getById(id);
+            // json文件
+            String content = examCard.getContent();
+            if (StringUtils.isNotBlank(content)) {
+                // 本地保存目录
+                tempParentFile = SystemConstant.getFileTempDirVar(SystemConstant.JSON_PREFIX);
+                // todo 2024-03-02 处理content卡格式填涂点信息
+                FileUtil.writeContent(tempParentFile, content);
+                FileUtil.outputFile(response, tempParentFile, examCard.getTitle() + SystemConstant.JSON_PREFIX);
+            } else {
+                throw ExceptionResultEnum.ERROR.exception("没有可下载的卡格式文件");
+            }
+        } catch (Exception e) {
+            throw ExceptionResultEnum.ERROR.exception("下载卡格式文件失败");
+        } finally {
+            if (Objects.nonNull(tempParentFile)) {
+                FileUtil.deleteFile(tempParentFile);
+            }
+        }
+    }
 }

+ 76 - 57
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskServiceImpl.java

@@ -26,6 +26,7 @@ import com.qmth.distributed.print.business.service.*;
 import com.qmth.distributed.print.business.templete.execute.AsyncPaperReviewPdfExportService;
 import com.qmth.distributed.print.business.util.CreatePdfUtil;
 import com.qmth.distributed.print.business.util.PdfUtil;
+import com.qmth.distributed.print.business.util.pdf.CreatePdfNewUtil;
 import com.qmth.teachcloud.common.bean.dto.AssignTeacherDto;
 import com.qmth.teachcloud.common.bean.dto.BlurryUserDto;
 import com.qmth.teachcloud.common.bean.dto.DataPermissionRule;
@@ -67,6 +68,7 @@ import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.math.BigDecimal;
 import java.nio.charset.StandardCharsets;
 import java.util.*;
 import java.util.stream.Collectors;
@@ -137,12 +139,16 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
     @Resource
     ExamTaskService examTaskService;
     @Resource
+    ExamTaskPaperDataService examTaskPaperDataService;
+    @Resource
     ExamStudentService examStudentService;
     @Resource
     TFFlowJoinService tfFlowJoinService;
     @Resource
     CreatePdfUtil createPdfUtil;
     @Resource
+    CreatePdfNewUtil createPdfNewUtil;
+    @Resource
     BasicPrintConfigService basicPrintConfigService;
     @Resource
     TFFlowLogService tfFlowLogService;
@@ -889,39 +895,40 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
     }
 
     @Override
-    public void paperDownload(HttpServletResponse response, Long examTaskId) throws Exception {
-        ExamTask examTask = this.getById(examTaskId);
+    public void paperDownload(HttpServletResponse response, Long examTaskId) {
         ExamTaskDetailPdfDownloadDto examTaskDetailPdfDownloadDto = examTaskDetailService.findPdfDownload(examTaskId);
         Optional.ofNullable(examTaskDetailPdfDownloadDto).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("数据异常"));
 
-        File tempFile = null;
         String rootPath = null;
         try {
             // 本地保存目录
-            tempFile = SystemConstant.getFileTempDirVar(System.currentTimeMillis() + File.separator + SystemConstant.getNanoId(), SystemConstant.TEMP_PREFIX);
-            rootPath = tempFile.getParent();
+            File tempFile = SystemConstant.getFileTempParentDirVar(SystemConstant.TEMP_PREFIX);
+            rootPath = tempFile.getPath() + File.separator + SystemConstant.getNanoId();
+
+            // 下载文件保存目录(用uuid命名)
+            String downloadFilePath = rootPath + File.separator + SystemConstant.getNanoId();
+            File downloadPathFile = new File(downloadFilePath);
+            if (!downloadPathFile.exists()) {
+                downloadPathFile.mkdirs();
+            }
+
             StringJoiner dirPath = new StringJoiner("");
-            dirPath = dirPath.add(rootPath).add(File.separator)
+            dirPath = dirPath.add(downloadFilePath).add(File.separator)
                     .add(examTaskDetailPdfDownloadDto.getSemesterName()).add(File.separator)
                     .add(examTaskDetailPdfDownloadDto.getExamName()).add(File.separator)
                     .add(examTaskDetailPdfDownloadDto.getCourseNameCode().replaceAll(" ", "")).add(File.separator)
-                    .add(examTaskDetailPdfDownloadDto.getPaperNumber()).add(File.separator)
-                    .add(examTaskDetailPdfDownloadDto.getCourseNameCode().replaceAll(" ", "")).add(SystemConstant.HYPHEN)
-                    .add(examTaskDetailPdfDownloadDto.getPaperNumber()).add(SystemConstant.HYPHEN);
-            List<File> fileList = new ArrayList<>();
+                    .add(examTaskDetailPdfDownloadDto.getPaperNumber()).add(File.separator);
             List<PaperInfoVo> paperInfoVoList = ExamTaskUtil.parsePaperAttachmentPath(examTaskDetailPdfDownloadDto.getPaperAttachmentIds());
             // 试卷
             for (PaperInfoVo paperInfoVo : paperInfoVoList) {
+                String originalFileName = paperInfoVo.getFilename().substring(0, paperInfoVo.getFilename().lastIndexOf("."));
                 Long attachmentId = Long.valueOf(paperInfoVo.getAttachmentId());
                 String name = paperInfoVo.getName();
                 if (Objects.nonNull(attachmentId)) {
                     BasicAttachment attachment = basicAttachmentService.getById(attachmentId);
                     Optional.ofNullable(attachment).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("附件数据异常"));
-                    String fileName = dirPath + "试卷" + SystemConstant.HYPHEN + name + attachment.getType();
-                    File file = fileUploadService.downloadFile(attachment, fileName);
-                    if (Objects.nonNull(file)) {
-                        fileList.add(file);
-                    }
+                    String fileName = dirPath + "试卷" + SystemConstant.HYPHEN + name + SystemConstant.HYPHEN + originalFileName + attachment.getType();
+                    fileUploadService.downloadFile(attachment, fileName);
                 }
 
                 // 题卡
@@ -929,18 +936,10 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
                 if (cardId != null) {
                     ExamCard examCard = examCardService.getById(cardId);
 
-                    String cardHtmlPath = dirPath + "题卡" + SystemConstant.HYPHEN + name + SystemConstant.HTML_PREFIX;
-                    String cardPdfPath = dirPath + "题卡" + SystemConstant.HYPHEN + name + SystemConstant.PDF_PREFIX;
-
-                    String htmlContent;
-                    // 通用模板
-                    if (MakeMethodEnum.SELECT.equals(examCard.getMakeMethod())) {
-                        htmlContent = createPdfUtil.resetHtmlTemplateBar(examCard.getHtmlContent());
-                    } else {
-                        BasicCardRule basicCardRule = basicCardRuleService.getById(examTask.getCardRuleId());
-                        htmlContent = createPdfUtil.replaceHtmlCard(examCard, basicCardRule);
-                    }
+                    String cardHtmlPath = dirPath + "题卡" + SystemConstant.HYPHEN + name + SystemConstant.HYPHEN + examCard.getTitle() + SystemConstant.HTML_PREFIX;
+                    String cardPdfPath = dirPath + "题卡" + SystemConstant.HYPHEN + name + SystemConstant.HYPHEN + examCard.getTitle() + SystemConstant.PDF_PREFIX;
 
+                    String htmlContent = createPdfNewUtil.replaceBlankHtmlContent(examCard.getHtmlContent());
                     // html
                     File htmlFile = new File(cardHtmlPath);
                     if (!htmlFile.exists()) {
@@ -948,8 +947,7 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
                         htmlFile.createNewFile();
                     }
                     // 生成html文件
-                    FileCopyUtils.copy(htmlContent.getBytes(StandardCharsets.UTF_8), htmlFile);
-                    fileList.add(htmlFile);
+                    FileUtil.writeContent(htmlFile, htmlContent);
                     // 转pdf文件
                     File pdfFile = new File(cardPdfPath);
                     if (!pdfFile.exists()) {
@@ -957,24 +955,15 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
                         pdfFile.createNewFile();
                     }
                     HtmlToPdfUtil.convert(cardHtmlPath, cardPdfPath, PageSizeEnum.A3);
-                    fileList.add(pdfFile);
                 }
             }
-            if (fileList.size() == 0) {
-                throw ExceptionResultEnum.ERROR.exception("没有可导出文件");
-            }
-            if (Objects.nonNull(tempFile)) {
-                tempFile.delete();
-            }
-            teachcloudCommonService.downloadFileAndZip(response, rootPath, rootPath, null);
+            String zipFileName = downloadPathFile.getName() + SystemConstant.ZIP_PREFIX;
+            FileUtil.downloadEncryptZip(response, downloadPathFile, zipFileName);
         } catch (Exception e) {
-            e.printStackTrace();
+            throw ExceptionResultEnum.ERROR.exception("文件下载失败");
         } finally {
-            if (Objects.nonNull(tempFile)) {
-                tempFile.delete();
-            }
             if (Objects.nonNull(rootPath)) {
-                ConvertUtil.delFolder(rootPath);
+                FileUtil.deleteDirectory(rootPath);
             }
         }
     }
@@ -1278,6 +1267,19 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
                 examCardService.update(updateWrapper);
             }
 
+            // 更新题库试卷表
+            for (PaperInfoVo paperInfoVo : paperInfoVoList) {
+                if (StringUtils.isNotBlank(paperInfoVo.getUuid())) {
+                    UpdateWrapper<ExamTaskPaperData> updateWrapper = new UpdateWrapper<>();
+                    updateWrapper.lambda().set(ExamTaskPaperData::getPaperNumber, examTask.getPaperNumber())
+                            .eq(ExamTaskPaperData::getExamId, examTask.getExamId())
+                            .eq(ExamTaskPaperData::getPaperNumber, paperInfoVo.getUuid())
+                            .eq(ExamTaskPaperData::getPaperId, paperInfoVo.getPaperId())
+                            .eq(ExamTaskPaperData::getUuid, paperInfoVo.getUuid());
+                    examTaskPaperDataService.update(updateWrapper);
+                }
+            }
+
             BasicExam basicExam = basicExamService.getById(examTask.getExamId());
             if (ExamModelEnum.MODEL1.equals(basicExam.getExamModel()) || ExamModelEnum.MODEL2.equals(basicExam.getExamModel())) {
                 // 创建印刷计划
@@ -2148,32 +2150,42 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
     }
 
     @Override
-    public Map<String, String> getTikuPaperData(Long examId, Long paperId) {
+    public Map<String, Object> getTikuPaperData(Long examId, Long paperId, String uuid) {
         Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
-        Map<String, String> map = new HashMap<>();
+        Map<String, Object> map = new HashMap<>();
         try {
             File paperDataFile = tikuUtils.getTikuPaperData(schoolId, paperId);
-            ExamTaskPaperData examTaskPaperData = saveTikuPaperData(examId, paperId, paperDataFile);
+            ExamTaskPaperData examTaskPaperData = saveTikuPaperData(examId, paperId, uuid, paperDataFile);
             map.put("uuid", examTaskPaperData.getUuid());
             map.put("answerJson", examTaskPaperData.getAnswerJson());
+            map.put("attachmentId", examTaskPaperData.getPaperPdfAttachmentId());
             return map;
         } catch (Exception e) {
             throw new RuntimeException(e);
         }
     }
 
-    private ExamTaskPaperData saveTikuPaperData(Long examId, Long paperId, File zipFile) {
+    private ExamTaskPaperData saveTikuPaperData(Long examId, Long paperId, String uuid, File zipFile) {
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
         String zipDestPath = null;
         try {
             zipDestPath = zipFile.getParent() + File.separator + System.nanoTime();
             Zip4jUtil.unzip(zipFile.getPath(), zipDestPath);
 
-            ExamTaskPaperData examTaskPaperData = new ExamTaskPaperData();
-            examTaskPaperData.setExamId(examId);
-            // 系统自动生成唯一码,命题任务提交时,根据唯一码反向更新真实的试卷编号
-            examTaskPaperData.setPaperNumber("0");
-            examTaskPaperData.setUuid(SystemConstant.getNanoId());
-            examTaskPaperData.setPaperId(paperId);
+            ExamTaskPaperData examTaskPaperData = examTaskPaperDataService.selectByMultiId(new ExamTaskPaperData(examId, uuid, paperId));
+            if (examTaskPaperData == null) {
+                examTaskPaperData = new ExamTaskPaperData();
+                examTaskPaperData.setExamId(examId);
+                // 系统自动生成唯一码,命题任务提交时,根据唯一码反向更新真实的试卷编号
+                uuid = SystemConstant.getNanoId();
+                examTaskPaperData.setPaperNumber(uuid);
+                examTaskPaperData.setUuid(uuid);
+                examTaskPaperData.setPaperId(paperId);
+            }
+            // data.zip
+            String zipPdfName = PdfUtil.md5FileName(examTaskPaperData.getUuid() + "data" + paperId + SystemConstant.ZIP_PREFIX);
+            FilePathVo filePathVoZip = fileUploadService.uploadFile(zipFile, UploadFileEnum.FILE, zipPdfName);
+            examTaskPaperData.setDataPacketPath(JSON.toJSONString(filePathVoZip));
             // paper.json
             String paperJson = FileUtils.readFileToString(new File(zipDestPath + File.separator + "paper.json"), StandardCharsets.UTF_8);
             examTaskPaperData.setPaperJson(paperJson);
@@ -2181,13 +2193,20 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
             String answerJson = FileUtils.readFileToString(new File(zipDestPath + File.separator + "answer.json"), StandardCharsets.UTF_8);
             examTaskPaperData.setAnswerJson(answerJson);
             // paper.pdf
-            String paperPdfName = PdfUtil.md5FileName(examTaskPaperData.getUuid() + "paper" + SystemConstant.PDF_PREFIX);
-            FilePathVo filePathVoPaper = fileUploadService.uploadFile(new File(zipDestPath + File.separator + "paper.pdf"), UploadFileEnum.PDF, paperPdfName);
-            examTaskPaperData.setPaperPdf(JSON.toJSONString(filePathVoPaper));
+            String paperPdfName = PdfUtil.md5FileName(examTaskPaperData.getUuid() + "paper" + paperId + SystemConstant.PDF_PREFIX);
+            File paperPdfFile = new File(zipDestPath + File.separator + "paper.pdf");
+            FilePathVo filePathVoPaper = fileUploadService.uploadFile(paperPdfFile, UploadFileEnum.PDF, paperPdfName);
+            BasicAttachment paperPdfBasicAttachment = new BasicAttachment(JSON.toJSONString(filePathVoPaper), paperPdfName, SystemConstant.PDF_PREFIX, new BigDecimal(paperPdfFile.length()), filePathVoPaper.getMd5(), sysUser.getId());
+            basicAttachmentService.save(paperPdfBasicAttachment);
+            examTaskPaperData.setPaperPdfAttachmentId(paperPdfBasicAttachment.getId());
             // answer.pdf
-            String answerPdfName = PdfUtil.md5FileName(examTaskPaperData.getUuid() + "answer" + SystemConstant.PDF_PREFIX);
-            FilePathVo filePathVoAnswer = fileUploadService.uploadFile(new File(zipDestPath + File.separator + "answer.pdf"), UploadFileEnum.PDF, answerPdfName);
-            examTaskPaperData.setAnswerPdf(JSON.toJSONString(filePathVoAnswer));
+            String answerPdfName = PdfUtil.md5FileName(examTaskPaperData.getUuid() + "answer" + paperId + SystemConstant.PDF_PREFIX);
+            File answerPdfFile = new File(zipDestPath + File.separator + "answer.pdf");
+            FilePathVo filePathVoAnswer = fileUploadService.uploadFile(answerPdfFile, UploadFileEnum.PDF, answerPdfName);
+            BasicAttachment answerBasicAttachment = new BasicAttachment(JSON.toJSONString(filePathVoAnswer), answerPdfName, SystemConstant.PDF_PREFIX, new BigDecimal(answerPdfFile.length()), filePathVoAnswer.getMd5(), sysUser.getId());
+            basicAttachmentService.save(answerBasicAttachment);
+            examTaskPaperData.setAnswerPdfAttachmentId(answerBasicAttachment.getId());
+            examTaskPaperDataService.saveOrUpdateByMultiId(examTaskPaperData);
             return examTaskPaperData;
         } catch (Exception e) {
             throw ExceptionResultEnum.ERROR.exception("获取试卷包数据失败");

+ 3 - 3
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/impl/TaskLogicServiceImpl.java

@@ -1321,7 +1321,7 @@ public class TaskLogicServiceImpl implements TaskLogicService {
                             htmlContent = createPdfUtil.resetHtmlTemplateBar(examCard.getHtmlContent());
                         } else {
                             BasicCardRule basicCardRule = basicCardRuleService.getById(examTask.getCardRuleId());
-                            htmlContent = createPdfUtil.replaceHtmlCard(examCard, basicCardRule);
+                            htmlContent = createPdfUtil.replaceHtmlCardAllParams(examCard, basicCardRule);
                         }
                         // html
                         File localFile = new File(cardHtmlPath);
@@ -1923,7 +1923,7 @@ public class TaskLogicServiceImpl implements TaskLogicService {
                                         htmlContent = createPdfUtil.resetHtmlTemplateBar(examCard.getHtmlContent());
                                     } else {
                                         BasicCardRule basicCardRule = basicCardRuleService.getById(cardRuleId);
-                                        htmlContent = createPdfUtil.replaceHtmlCard(examCard, basicCardRule);
+                                        htmlContent = createPdfUtil.replaceHtmlCardAllParams(examCard, basicCardRule);
                                     }
 
                                     byte[] bytes = htmlContent.getBytes(StandardCharsets.UTF_8);
@@ -1994,7 +1994,7 @@ public class TaskLogicServiceImpl implements TaskLogicService {
                                         htmlContent = createPdfUtil.resetHtmlTemplateBar(examCard.getHtmlContent());
                                     } else {
                                         BasicCardRule basicCardRule = basicCardRuleService.getById(cardRuleId);
-                                        htmlContent = createPdfUtil.replaceHtmlCard(examCard, basicCardRule);
+                                        htmlContent = createPdfUtil.replaceHtmlCardAllParams(examCard, basicCardRule);
                                     }
 
                                     byte[] bytes = htmlContent.getBytes(StandardCharsets.UTF_8);

+ 1 - 2
distributed-print-business/src/main/java/com/qmth/distributed/print/business/util/CreatePdfUtil.java

@@ -572,9 +572,8 @@ public class CreatePdfUtil {
      *
      * @param examCard
      * @return
-     * @throws IOException
      */
-    public String replaceHtmlCard(ExamCard examCard, BasicCardRule basicCardRule) throws IOException {
+    public String replaceHtmlCardAllParams(ExamCard examCard, BasicCardRule basicCardRule) {
         //通用题卡
         String cardTemp = examCard.getHtmlContent();
         cardTemp = cardTemp.replaceAll("\\$\\{paperTypeName\\}", "");

+ 6 - 105
distributed-print-business/src/main/java/com/qmth/distributed/print/business/util/HtmlToJpgUtil.java

@@ -2,41 +2,22 @@ package com.qmth.distributed.print.business.util;
 
 import com.alibaba.fastjson.JSON;
 import com.qmth.distributed.print.business.bean.marking.ConvertJpgStorage;
-import com.qmth.distributed.print.business.service.PrintCommonService;
 import com.qmth.teachcloud.common.bean.vo.FilePathVo;
-import com.qmth.teachcloud.common.config.DictionaryConfig;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.BasicAttachment;
-import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
-import com.qmth.teachcloud.common.enums.PageSizeEnum;
 import com.qmth.teachcloud.common.enums.UploadFileEnum;
 import com.qmth.teachcloud.common.service.BasicAttachmentService;
 import com.qmth.teachcloud.common.service.FileUploadService;
 import com.qmth.teachcloud.common.util.ConvertUtil;
-import com.qmth.teachcloud.common.util.HtmlToPdfUtil;
-import org.apache.commons.codec.digest.DigestUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.http.entity.ContentType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.context.annotation.Lazy;
-import org.springframework.mock.web.MockMultipartFile;
 import org.springframework.stereotype.Component;
-import org.springframework.util.FileCopyUtils;
-import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
 import java.io.File;
-import java.io.FileInputStream;
-import java.io.InputStream;
 import java.math.BigDecimal;
-import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Objects;
-import java.util.StringJoiner;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
 
 /**
  * @Description: 题卡html转化为
@@ -46,11 +27,6 @@ import java.util.stream.Stream;
 @Component
 public class HtmlToJpgUtil {
 
-    @Lazy
-    @Resource
-    private PrintCommonService printCommonService;
-    @Resource
-    private DictionaryConfig dictionaryConfig;
     @Resource
     private BasicAttachmentService basicAttachmentService;
     @Resource
@@ -59,57 +35,13 @@ public class HtmlToJpgUtil {
     private final static Logger log = LoggerFactory.getLogger(HtmlToJpgUtil.class);
 
     /**
-     * 转换html -> jpg : 生成本地临时文件
+     * pdf转图片
      *
-     * @param id           题卡Id
-     * @param htmlContent  html内容
-     * @param pageSizeEnum 转化pdf的纸张类型
+     * @param cardId
+     * @param file
+     * @param userId
+     * @return
      */
-    public List<BasicAttachment> convertHtmlToJpg(Long id, String htmlContent, PageSizeEnum pageSizeEnum) {
-        boolean oss = dictionaryConfig.sysDomain().isOss();
-        StringJoiner stringJoiner = new StringJoiner("");
-        if (!oss && Objects.nonNull(dictionaryConfig.fssPublicDomain()) && !StringUtils.isBlank(dictionaryConfig.fssPublicDomain().getConfig()) && !dictionaryConfig.fssPublicDomain().getConfig().startsWith(SystemConstant.START_PARENT)) {
-            stringJoiner.add(dictionaryConfig.fssPublicDomain().getConfig()).add(File.separator);
-        }
-        stringJoiner = SystemConstant.getDirName(stringJoiner, UploadFileEnum.IMAGE, true);
-
-        // 本地存储目录
-        String rootPath = stringJoiner.toString();
-        // html临时路径
-        String htmlPath = rootPath + File.separator + "html" + File.separator + id + SystemConstant.HTML_PREFIX;
-        // pdf临时路径
-        String pdfPath = rootPath + File.separator + "pdf" + File.separator + id + SystemConstant.PDF_PREFIX;
-        // jpg临时路径
-        String jpgPath = rootPath + File.separator + "jpg" + File.separator + id;
-        List<BasicAttachment> basicAttachmentList = new ArrayList<>();
-        // html
-        try {
-            File htmlFile = new File(htmlPath);
-            if (!htmlFile.exists()) {
-                htmlFile.getParentFile().mkdirs();
-            }
-            // 生成html文件
-            FileCopyUtils.copy(htmlContent.getBytes(StandardCharsets.UTF_8), htmlFile);
-            // 转pdf文件
-            HtmlToPdfUtil.convert(htmlPath, pdfPath, pageSizeEnum);
-            // pdf文件转jpg
-            List<File> jpgFileList = ConvertUtil.pdfToImageFile(pdfPath, jpgPath);
-
-            for (File jpgFile : jpgFileList) {
-                InputStream inputStream = new FileInputStream(jpgFile);
-                MultipartFile multipartFile = new MockMultipartFile(jpgFile.getName(), jpgFile.getName(),
-                        ContentType.APPLICATION_OCTET_STREAM.toString(), inputStream);
-                BasicAttachment basicAttachment = printCommonService.saveAttachment(multipartFile, DigestUtils.md5Hex(multipartFile.getBytes()), UploadFileEnum.FILE);
-                basicAttachmentList.add(basicAttachment);
-            }
-        } catch (Exception e) {
-            log.error(e.getMessage());
-        } finally {
-            ConvertUtil.delFolder(rootPath);
-        }
-        return basicAttachmentList;
-    }
-
     public List<ConvertJpgStorage> convertPdfToJpg(Long cardId, File file, Long userId) {
         // jpg临时路径
         List<ConvertJpgStorage> convertJpgStorages = new ArrayList<>();
@@ -122,7 +54,7 @@ public class HtmlToJpgUtil {
                 int index = i + 1;
                 String fileName = cardId + "-" + index + SystemConstant.JPG_PREFIX;
                 FilePathVo filePathVo = fileUploadService.uploadFile(jpgFileList.get(i), UploadFileEnum.IMAGE, fileName);
-                BasicAttachment basicAttachment = new BasicAttachment(JSON.toJSONString(filePathVo), fileName, SystemConstant.PDF_PREFIX, new BigDecimal(file.length()), filePathVo.getMd5(), userId);
+                BasicAttachment basicAttachment = new BasicAttachment(JSON.toJSONString(filePathVo), fileName, SystemConstant.JPG_PREFIX, new BigDecimal(file.length()), filePathVo.getMd5(), userId);
                 basicAttachmentService.save(basicAttachment);
                 basicAttachmentList.add(basicAttachment);
 
@@ -133,35 +65,4 @@ public class HtmlToJpgUtil {
         }
         return convertJpgStorages;
     }
-
-    /**
-     * 转换html -> jpg : 生成本地临时文件
-     *
-     * @param id           题卡名称
-     * @param htmlContent  题卡内容
-     * @param pageSizeEnum 转化pdf的纸张类型
-     */
-    public List<ConvertJpgStorage> convertHtmlToJpgByCard(Long id, String htmlContent, PageSizeEnum pageSizeEnum) {
-        List<ConvertJpgStorage> convertJpgStorageList = new ArrayList<>();
-        try {
-            String regex = "\\$\\{\\w+}";
-            htmlContent = htmlContent.replaceAll("<img src=\"data:image/png;base64,\\$\\{examNumber\\}\">", "");
-            htmlContent = htmlContent.replaceAll(regex, "");
-            convertJpgStorageList = this.convertHtmlToJpg(id, htmlContent, pageSizeEnum).stream().flatMap(e -> {
-                ConvertJpgStorage tmp = new ConvertJpgStorage();
-                String name = e.getName();
-                String index = name.substring(name.lastIndexOf(SystemConstant.HYPHEN) + 1);
-                tmp.setAttachmentId(e.getId());
-                tmp.setIndex(Integer.valueOf(index));
-                return Stream.of(tmp);
-            }).collect(Collectors.toList());
-
-            if (convertJpgStorageList.size() == 0) {
-                throw ExceptionResultEnum.ERROR.exception("生成jpg文件异常");
-            }
-        } catch (Exception e) {
-            log.error(e.getMessage());
-        }
-        return convertJpgStorageList;
-    }
 }

+ 8 - 41
distributed-print-business/src/main/java/com/qmth/distributed/print/business/util/pdf/CreatePdfNewUtil.java

@@ -573,51 +573,18 @@ public class CreatePdfNewUtil {
     }
 
     /**
-     * 替换自定义题卡参数
+     * 题卡html内容,所有参数置空
      *
-     * @param examCard
+     * @param htmlContent
      * @return
-     * @throws IOException
      */
-    public String replaceHtmlCard(ExamCard examCard, BasicCardRule basicCardRule) throws IOException {
-        //通用题卡
-        String cardTemp = examCard.getHtmlContent();
-        cardTemp = cardTemp.replaceAll("\\$\\{paperTypeName\\}", "");
-        //随机生成试卷条码并将图片转成base64
-        cardTemp = cardTemp.replaceAll("\\$\\{paperType\\}", "");
-        cardTemp = cardTemp.replaceAll("<img src=\"data:image/png;base64,\\$\\{examNumber\\}\">", "");
-        cardTemp = cardTemp.replaceAll("\\$\\{examNumberStr\\}", "");
-        if (Objects.nonNull(basicCardRule) && Objects.nonNull(basicCardRule.getExtendFields())) {
-            JSONArray jsonObjectExtend = (JSONArray) JSONArray.parse(basicCardRule.getExtendFields());//扩展字段
-            if (Objects.nonNull(jsonObjectExtend)) {
-                for (int i = 0; i < jsonObjectExtend.size(); i++) {
-                    JSONObject object = (JSONObject) jsonObjectExtend.get(i);
-                    cardTemp = cardTemp.replaceAll("\\$\\{" + object.get("code") + "\\}", "");
-                }
-            }
-        }
-        cardTemp = cardTemp.replaceAll("\\$\\{examDate\\}", "");
-        cardTemp = cardTemp.replaceAll("\\$\\{examTime\\}", "");
-        cardTemp = cardTemp.replaceAll("\\$\\{ticketNumber\\}", "");
-        cardTemp = cardTemp.replaceAll("\\$\\{siteNumber\\}", "");
-        cardTemp = cardTemp.replaceAll("\\$\\{paperTypeName\\}", "");
-        cardTemp = cardTemp.replaceAll("\\$\\{studentCode\\}", "");
-        cardTemp = cardTemp.replaceAll("\\$\\{studentName\\}", "");
-        cardTemp = cardTemp.replaceAll("\\$\\{courseName\\}", "");
-        cardTemp = cardTemp.replaceAll("\\$\\{courseCode\\}", "");
-        cardTemp = cardTemp.replaceAll("\\$\\{examPlace\\}", "");
-        cardTemp = cardTemp.replaceAll("\\$\\{examRoom\\}", "");
-        cardTemp = cardTemp.replaceAll("\\$\\{paperNumber\\}", "");
-
-        // 根据题卡规则必选字段,替换相应值,没有则“”
-        List<StudentExtendDto> studentExtendDtos = createExtendObjectNull(basicCardRule);
-        if (studentExtendDtos != null) {
-            for (StudentExtendDto extendDto : studentExtendDtos) {
-                cardTemp = cardTemp.replaceAll("\\$\\{" + extendDto.getFieldName() + "\\}", String.valueOf(extendDto.getValue()));
-            }
-        }
+    public String replaceBlankHtmlContent(String htmlContent) {
+        // 替换条码参数
+        htmlContent = htmlContent.replaceAll("<img src=\"data:image/png;base64,\\$\\{examNumber\\}\">", "");
+        // 正则匹配所有参数,填入空值
+        htmlContent = htmlContent.replaceAll("\\$\\{[A-Za-z0-9]+\\}", "");
+        return htmlContent;
 
-        return cardTemp;
     }
 
     /**

+ 0 - 59
distributed-print-business/src/main/resources/db/log/脚本-caozx.sql

@@ -1,59 +0,0 @@
-CREATE TABLE `course_dimension` (
-    `id` BIGINT(20) NOT NULL COMMENT 'id',
-    `school_id` BIGINT(20) NOT NULL COMMENT '学校id',
-    `semester_id` BIGINT(20) NOT NULL COMMENT '学期id',
-    `exam_id` BIGINT(20) NOT NULL COMMENT '考试id',
-    `course_code` VARCHAR(20) NOT NULL COMMENT '课程编号',
-    `code` VARCHAR(32) NOT NULL COMMENT '知识点编号',
-    `name` VARCHAR(255) NOT NULL COMMENT '知识点名称',
-    `number` INT NOT NULL COMMENT '排序',
-    `parent_id` BIGINT(20) NOT NULL COMMENT '父id(顶级知识点父id为0)',
-    `create_id` BIGINT(20) NULL COMMENT '创建人',
-    `create_time` BIGINT(20) NULL COMMENT '创建时间',
-    `update_id` BIGINT(20) NULL COMMENT '更新人',
-    `update_time` BIGINT(20) NULL COMMENT '更新时间',
-    PRIMARY KEY (`id`)
-)  ENGINE=INNODB DEFAULT CHARACTER SET=UTF8MB4 COMMENT='课程知识点表';
-
-
-
-ALTER TABLE `teach_course`
-    ADD COLUMN `exam_id` BIGINT NOT NULL COMMENT '考试id' AFTER `school_id`,
-    ADD COLUMN `course_code` VARCHAR(20) NOT NULL COMMENT '课程编号' AFTER `exam_id`,
-    ADD COLUMN `weight_setting` TINYINT(1) NULL COMMENT '权重设置' AFTER `enable`,
-    CHANGE COLUMN `user_id` `user_id` BIGINT NOT NULL COMMENT '任课教师id' AFTER `course_code`,
-    DROP INDEX `teach_course_unique` ,
-    ADD UNIQUE INDEX `teach_course_unique` USING BTREE (`school_id`, `exam_id`, `course_code`, `user_id`);
-;
-
-ALTER TABLE `course_dimension` 
-ADD COLUMN `teach_course_id` BIGINT NOT NULL COMMENT '教学课程id' AFTER `id`,
-ADD COLUMN `user_id` BIGINT NOT NULL COMMENT '教师id' AFTER `course_code`,
-ADD COLUMN `source` VARCHAR(20) NOT NULL COMMENT '来源' AFTER `user_id`;
-ALTER TABLE `course_dimension` 
-DROP INDEX `course_dimension_unique` ,
-ADD UNIQUE INDEX `course_dimension_unique` (`teach_course_id` ASC, `source` ASC, `code` ASC);
-;
-
-ALTER TABLE `course_evaluation` 
-ADD COLUMN `teach_course_id` BIGINT NOT NULL COMMENT '教学课程id' AFTER `id`,
-ADD COLUMN `user_id` BIGINT NOT NULL COMMENT '教师id' AFTER `course_code`,
-ADD COLUMN `type` VARCHAR(20) NOT NULL COMMENT '类型(默认DEFAULT、自定义CUSTOM)' AFTER `user_id`,
-DROP INDEX `course_evaluation_unique` ,
-ADD UNIQUE INDEX `course_evaluation_unique` (`teach_course_id` ASC, `evaluation` ASC);
-;
-
-ALTER TABLE `course_target` 
-ADD COLUMN `teach_course_id` BIGINT NOT NULL COMMENT '教学课程id' AFTER `id`,
-ADD COLUMN `user_id` BIGINT NOT NULL COMMENT '教师id' AFTER `course_code`,
-DROP INDEX `course_target_unique` ,
-ADD UNIQUE INDEX `course_target_unique` (`teach_course_id` ASC, `target_name` ASC);
-;
-
-ALTER TABLE `course_weight` 
-ADD COLUMN `teach_course_id` BIGINT NOT NULL COMMENT '教学课程id' AFTER `id`,
-ADD COLUMN `user_id` BIGINT NOT NULL COMMENT '教师id' AFTER `course_code`,
-DROP INDEX `course_weight_unique` ,
-ADD UNIQUE INDEX `course_weight_unique` (`teach_course_id` ASC, `target_id` ASC, `evaluation_id` ASC);
-;
-

+ 3 - 2
distributed-print-business/src/main/resources/mapper/ExamTaskPaperDataMapper.xml

@@ -10,8 +10,9 @@
         <result column="data_packet_path" property="dataPacketPath" />
         <result column="paper_json" property="paperJson" />
         <result column="answer_json" property="answerJson" />
-        <result column="paper_pdf" property="paperPdf" />
-        <result column="answer_pdf" property="answerPdf" />
+        <result column="paper_pdf_attachment_id" property="paperPdfAttachmentId" />
+        <result column="answer_pdf_attachment_id" property="answerPdfAttachmentId" />
+        <result column="uuid" property="uuid" />
     </resultMap>
 
 </mapper>

+ 65 - 2
distributed-print/install/mysql/upgrade/3.3.1.sql

@@ -402,7 +402,70 @@ INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence
 UPDATE `sys_privilege` SET `related` = '71,167,286,287,424,477,417,420,421,441,442,640,641' WHERE (`id` = '283');
 UPDATE `sys_privilege` SET `related` = '49,167,174,286,287,371,464,465,427,642,417,420,421,441,442,640,641,642' WHERE (`id` = '463');
 
+-- 2024/03/01
+CREATE TABLE `course_dimension` (
+                                    `id` BIGINT(20) NOT NULL COMMENT 'id',
+                                    `school_id` BIGINT(20) NOT NULL COMMENT '学校id',
+                                    `semester_id` BIGINT(20) NOT NULL COMMENT '学期id',
+                                    `exam_id` BIGINT(20) NOT NULL COMMENT '考试id',
+                                    `course_code` VARCHAR(20) NOT NULL COMMENT '课程编号',
+                                    `code` VARCHAR(32) NOT NULL COMMENT '知识点编号',
+                                    `name` VARCHAR(255) NOT NULL COMMENT '知识点名称',
+                                    `number` INT NOT NULL COMMENT '排序',
+                                    `parent_id` BIGINT(20) NOT NULL COMMENT '父id(顶级知识点父id为0)',
+                                    `create_id` BIGINT(20) NULL COMMENT '创建人',
+                                    `create_time` BIGINT(20) NULL COMMENT '创建时间',
+                                    `update_id` BIGINT(20) NULL COMMENT '更新人',
+                                    `update_time` BIGINT(20) NULL COMMENT '更新时间',
+                                    PRIMARY KEY (`id`)
+)  ENGINE=INNODB DEFAULT CHARACTER SET=UTF8MB4 COMMENT='课程知识点表';
+
+
+
+ALTER TABLE `teach_course`
+    ADD COLUMN `exam_id` BIGINT NOT NULL COMMENT '考试id' AFTER `school_id`,
+    ADD COLUMN `course_code` VARCHAR(20) NOT NULL COMMENT '课程编号' AFTER `exam_id`,
+    ADD COLUMN `weight_setting` TINYINT(1) NULL COMMENT '权重设置' AFTER `enable`,
+    CHANGE COLUMN `user_id` `user_id` BIGINT NOT NULL COMMENT '任课教师id' AFTER `course_code`,
+DROP INDEX `teach_course_unique` ,
+    ADD UNIQUE INDEX `teach_course_unique` USING BTREE (`school_id`, `exam_id`, `course_code`, `user_id`);
+;
+
+ALTER TABLE `course_dimension`
+    ADD COLUMN `teach_course_id` BIGINT NOT NULL COMMENT '教学课程id' AFTER `id`,
+ADD COLUMN `user_id` BIGINT NOT NULL COMMENT '教师id' AFTER `course_code`,
+ADD COLUMN `source` VARCHAR(20) NOT NULL COMMENT '来源' AFTER `user_id`;
+ALTER TABLE `course_dimension`
+DROP INDEX `course_dimension_unique` ,
+ADD UNIQUE INDEX `course_dimension_unique` (`teach_course_id` ASC, `source` ASC, `code` ASC);
+;
+
+ALTER TABLE `course_evaluation`
+    ADD COLUMN `teach_course_id` BIGINT NOT NULL COMMENT '教学课程id' AFTER `id`,
+ADD COLUMN `user_id` BIGINT NOT NULL COMMENT '教师id' AFTER `course_code`,
+ADD COLUMN `type` VARCHAR(20) NOT NULL COMMENT '类型(默认DEFAULT、自定义CUSTOM)' AFTER `user_id`,
+DROP INDEX `course_evaluation_unique` ,
+ADD UNIQUE INDEX `course_evaluation_unique` (`teach_course_id` ASC, `evaluation` ASC);
+;
+
+ALTER TABLE `course_target`
+    ADD COLUMN `teach_course_id` BIGINT NOT NULL COMMENT '教学课程id' AFTER `id`,
+ADD COLUMN `user_id` BIGINT NOT NULL COMMENT '教师id' AFTER `course_code`,
+DROP INDEX `course_target_unique` ,
+ADD UNIQUE INDEX `course_target_unique` (`teach_course_id` ASC, `target_name` ASC);
+;
+
+ALTER TABLE `course_weight`
+    ADD COLUMN `teach_course_id` BIGINT NOT NULL COMMENT '教学课程id' AFTER `id`,
+ADD COLUMN `user_id` BIGINT NOT NULL COMMENT '教师id' AFTER `course_code`,
+DROP INDEX `course_weight_unique` ,
+ADD UNIQUE INDEX `course_weight_unique` (`teach_course_id` ASC, `target_id` ASC, `evaluation_id` ASC);
+;
+
+
 
+-- 2024/03/02
+DROP TABLE IF EXISTS `exam_task_paper_data`;
 CREATE TABLE `exam_task_paper_data` (
            `exam_id` BIGINT(20) NOT NULL COMMENT '考试ID',
            `paper_number` VARCHAR(100) NOT NULL COMMENT '试卷编号',
@@ -410,8 +473,8 @@ CREATE TABLE `exam_task_paper_data` (
            `data_packet_path` VARCHAR(200) NULL COMMENT '题库试卷数据包地址(zip)',
            `paper_json` MEDIUMTEXT NULL COMMENT '试卷结构内容(从paper.json解析)',
            `answer_json` MEDIUMTEXT NULL COMMENT '试卷答案内容(从answer.json解析)',
-           `paper_pdf` VARCHAR(200) NULL COMMENT '试卷pdf文件地址(paper.pdf上传地址)',
-           `answer_pdf` VARCHAR(200) NULL COMMENT '标答pdf文件地址(answer.pdf上传地址)',
+           `paper_pdf_attachment_id` BIGINT(20) NULL COMMENT '试卷pdf文件地址(paper.pdf上传附件ID)',
+           `answer_pdf_attachment_id` BIGINT(20) NULL COMMENT '标答pdf文件地址(answer.pdf上传附件ID)',
            `uuid` VARCHAR(200) NULL COMMENT '唯一标识',
            PRIMARY KEY (`exam_id`, `paper_number`, `paper_id`))
     COMMENT = '命题任务选择题库试卷相关文件表';

+ 15 - 2
distributed-print/src/main/java/com/qmth/distributed/print/api/ExamCardController.java

@@ -174,8 +174,8 @@ public class ExamCardController {
      */
     @ApiOperation(value = "导出题卡文件")
     @RequestMapping(value = "/download_card", method = RequestMethod.POST)
-    public void cardDownload(HttpServletResponse response, @RequestParam(value = "id") String id) {
-        examCardService.cardDownload(response, id);
+    public void downloadCard(HttpServletResponse response, @RequestParam(value = "id") String id) {
+        examCardService.downloadCard(response, id);
     }
 
     /**
@@ -189,4 +189,17 @@ public class ExamCardController {
                                                @ApiParam(value = "试卷类型", required = true) @RequestParam String paperType) {
         return ResultUtil.ok(examCardService.listCardImage(examId, paperNumber, paperType));
     }
+
+    /**
+     * 下载(包含pdf,html,json,jpg)
+     *
+     * @param response
+     * @param id       题卡ID
+     */
+    @ApiOperation(value = "下载卡格式")
+    @RequestMapping(value = "/download_card_json", method = RequestMethod.POST)
+    public void downloadCardJson(HttpServletResponse response,
+                             @ApiParam(value = "题卡ID", required = true) @RequestParam(value = "id") String id) {
+        examCardService.downloadCardJson(response, id);
+    }
 }

+ 4 - 3
distributed-print/src/main/java/com/qmth/distributed/print/api/ExamTaskApplyController.java

@@ -278,9 +278,10 @@ public class ExamTaskApplyController {
     @RequestMapping(value = "/get_tiku_paper_data", method = RequestMethod.POST)
     @Transactional(rollbackFor = Exception.class)
     @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class)})
-    public Result getTikuPaperData(@ApiParam(value = "考试ID", required = true) @RequestParam Long examId,
-                                   @ApiParam(value = "题库试卷ID", required = true) @RequestParam Long paperId) {
-        return ResultUtil.ok(examTaskService.getTikuPaperData(examId, paperId));
+    public Result getTikuPaperData(@ApiParam(value = "考试ID", required = true) @RequestParam(value = "examId") Long examId,
+                                   @ApiParam(value = "题库试卷ID", required = true) @RequestParam(value = "paperId") Long paperId,
+                                   @ApiParam(value = "唯一标识") @RequestParam(value = "uuid", required = false) String uuid) {
+        return ResultUtil.ok(examTaskService.getTikuPaperData(examId, paperId, uuid));
     }
 }
 

+ 18 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/vo/PaperInfoVo.java

@@ -4,6 +4,8 @@ public class PaperInfoVo {
 
     private String name;
     private String attachmentId;
+    private Long paperId;
+    private String uuid;
     private String cardId;
     private String cardType;
     private String createMethod;
@@ -31,6 +33,22 @@ public class PaperInfoVo {
         this.attachmentId = attachmentId;
     }
 
+    public Long getPaperId() {
+        return paperId;
+    }
+
+    public void setPaperId(Long paperId) {
+        this.paperId = paperId;
+    }
+
+    public String getUuid() {
+        return uuid;
+    }
+
+    public void setUuid(String uuid) {
+        this.uuid = uuid;
+    }
+
     public String getCardId() {
         return cardId;
     }

+ 21 - 24
teachcloud-common/src/main/java/com/qmth/teachcloud/common/contant/SystemConstant.java

@@ -14,10 +14,7 @@ import com.qmth.teachcloud.common.enums.LocalCatalogEnum;
 import com.qmth.teachcloud.common.enums.TFCustomTypeEnum;
 import com.qmth.teachcloud.common.enums.UploadFileEnum;
 import com.qmth.teachcloud.common.service.CommonCacheService;
-import com.qmth.teachcloud.common.util.Base64Util;
-import com.qmth.teachcloud.common.util.FileStoreUtil;
-import com.qmth.teachcloud.common.util.ServletUtil;
-import com.qmth.teachcloud.common.util.Zip4jUtil;
+import com.qmth.teachcloud.common.util.*;
 import org.apache.commons.codec.digest.DigestUtils;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -941,6 +938,26 @@ public class SystemConstant {
         return file;
     }
 
+    /**
+     * 获取临时目录根路径
+     *
+     * @param suffix
+     * @return
+     */
+    public static File getFileTempParentDirVar(String suffix) {
+        File file = null;
+        try {
+            file = getFileTempDirVar(suffix);
+            return file.getParentFile();
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        } finally {
+            if (file != null) {
+                FileUtil.deleteFile(file);
+            }
+        }
+    }
+
     /**
      * 获取临时文件
      *
@@ -1158,26 +1175,6 @@ public class SystemConstant {
         }
     }
 
-    /**
-     * 生成文件
-     *
-     * @param url     文件路径+文件名称
-     * @param content 要生成的文件内容
-     */
-    public static File createJsonFile(String url, String content) {
-        File file = new File(url);
-        try {
-            if (!file.exists()) {
-                file.getParentFile().mkdirs();
-                file.createNewFile();
-            }
-            IOUtils.write(content.getBytes(StandardCharsets.UTF_8), new FileOutputStream(file));
-        } catch (Exception e) {
-            log.error(SystemConstant.LOG_ERROR, e);
-        }
-        return file;
-    }
-
     /**
      * 生成文件
      *

+ 63 - 95
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/TeachcloudCommonService.java

@@ -3,7 +3,6 @@ package com.qmth.teachcloud.common.service;
 import com.qmth.teachcloud.common.bean.auth.AuthBean;
 import com.qmth.teachcloud.common.bean.result.LoginResult;
 import com.qmth.teachcloud.common.bean.result.MenuResult;
-import com.qmth.teachcloud.common.entity.BasicAttachment;
 import com.qmth.teachcloud.common.entity.SysRolePrivilege;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.entity.SysUserRole;
@@ -11,7 +10,6 @@ import com.qmth.teachcloud.common.enums.AppSourceEnum;
 import com.qmth.teachcloud.common.enums.PrivilegePropertyEnum;
 import com.qmth.teachcloud.common.enums.SystemCodeEnum;
 
-import javax.servlet.http.HttpServletResponse;
 import java.io.File;
 import java.security.NoSuchAlgorithmException;
 import java.util.List;
@@ -19,210 +17,180 @@ import java.util.Map;
 import java.util.Set;
 
 /**
- * @Description: 公共服务service
- * @Param:
- * @return:
- * @Author: wangliang
- * @Date: 2021/3/26
+ * 公共服务service
  */
 public interface TeachcloudCommonService {
 
     /**
      * 获取用户菜单
      *
-     * @param userId
-     * @return
+     * @param userId 用户ID
      */
-    public MenuResult getUserMenu(Long userId);
+    MenuResult getUserMenu(Long userId);
 
     /**
      * 新增用户权限
      *
-     * @param sysUser
-     * @param roleId
+     * @param sysUser 用户对象
+     * @param roleId  角色ID
      */
-    public void addUserRolePrivilege(SysUser sysUser, Long roleId);
+    void addUserRolePrivilege(SysUser sysUser, Long roleId);
 
     /**
      * 新增用户权限
      *
-     * @param sysUser
-     * @param roleIds
+     * @param sysUser 用户对象
+     * @param roleIds 角色ID集合
      */
-    public void addUserRolePrivilege(SysUser sysUser, Long[] roleIds);
+    void addUserRolePrivilege(SysUser sysUser, Long[] roleIds);
 
     /**
      * 获取要新增的用户权限集合
      *
-     * @param sysUser
-     * @param roleIds
-     * @return
+     * @param sysUser 用户对象
+     * @param roleIds 角色ID集合
      */
     List<SysUserRole> disposeUserPrivilege(SysUser sysUser, Long[] roleIds);
 
     /**
      * 获取用户角色
      *
-     * @param userId
-     * @return
+     * @param userId 用户ID
      */
-    public List<SysUserRole> getUserRolePrivilege(Long userId);
+    List<SysUserRole> getUserRolePrivilege(Long userId);
 
     /**
      * 获取角色权限
      *
-     * @param roleId
-     * @return
+     * @param roleId 角色ID
      */
-    public List<SysRolePrivilege> getRolePrivilege(Long schoolId, Long roleId);
+    List<SysRolePrivilege> getRolePrivilege(Long schoolId, Long roleId);
 
     /**
      * 获取用户权限
      *
-     * @param userId
-     * @return
+     * @param userId 用户ID
      */
-    public AuthBean getUserAuth(Long userId);
+    AuthBean getUserAuth(Long userId);
 
     /**
      * 获取鉴权url
      *
-     * @param privilegePropertyEnum
-     * @return
+     * @param privilegePropertyEnum 鉴权属性枚举类
      */
-    public Set<String> getPrivilegeUrl(PrivilegePropertyEnum privilegePropertyEnum);
+    Set<String> getPrivilegeUrl(PrivilegePropertyEnum privilegePropertyEnum);
 
     /**
      * 获取鉴权url
      *
-     * @param privilegePropertyEnum
-     * @param schoolId
-     * @return
+     * @param privilegePropertyEnum 鉴权属性枚举类
+     * @param schoolId              学校ID
      */
-    public Set<String> getPrivilegeUrl(PrivilegePropertyEnum privilegePropertyEnum, Long schoolId);
+    Set<String> getPrivilegeUrl(PrivilegePropertyEnum privilegePropertyEnum, Long schoolId);
 
     /**
      * 删除用户信息
      *
-     * @param userId
-     * @param all
+     * @param userId 用户ID
+     * @param all    是否所有平台
      */
-    public void removeUserInfo(Long userId, boolean all) throws NoSuchAlgorithmException;
+    void removeUserInfo(Long userId, boolean all) throws NoSuchAlgorithmException;
 
     /**
      * 批量删除用户信息
      *
-     * @param userIds
-     * @param all
+     * @param userIds 用户ID集合
+     * @param all     是否所有平台
      */
-    public void removeUserInfoBatch(List<Long> userIds, boolean all);
+    void removeUserInfoBatch(List<Long> userIds, boolean all);
 
     /**
      * 文件预览
      *
-     * @param path
-     * @return
+     * @param path 文件path
      */
-    public String filePreview(String path);
-    
+    String filePreview(String path);
+
     /**
      * 批量文件预览
      *
-     * @param path
-     * @return
+     * @param path 文件path集合
      */
-    public List<String> filePreview(List<String> path);
+    List<String> filePreview(List<String> path);
 
     /**
      * 阅卷图片
-     * @param path
-     * @return
-     */
-    public List<String> fileMarkPreview(List<String> path);
-
-    public String filePreview(Long attachmentId);
-
-    /**
-     * 文件预览
      *
-     * @param path
-     * @return
+     * @param path 文件path
      */
-    public String filePreviewByPathAndType(String path, String uploadType, String type, Boolean isExpire);
+    List<String> fileMarkPreview(List<String> path);
 
     /**
      * 文件预览
      *
-     * @param attachmentId
-     * @return
+     * @param attachmentId 附件ID
      */
-    public Map<String, String> filePreviewByAttachmentId(Long attachmentId, Boolean isExpire);
+    String filePreview(Long attachmentId);
 
     /**
-     * 题卡html文件上传,读取文件内容
+     * 文件预览
      *
-     * @param path
-     * @return
+     * @param path       文件path
+     * @param uploadType 上传类型
+     * @param type       本地或者oss
+     * @param isExpire   是否带过期信息
      */
-    public String readFileContent(String path);
+    String filePreviewByPathAndType(String path, String uploadType, String type, Boolean isExpire);
 
     /**
-     * 获取文件
+     * 文件预览
      *
-     * @param path
-     * @param pdf
-     * @param fileTempList
-     * @return
+     * @param attachmentId 附件ID
+     * @param isExpire     是否带过期信息
      */
-    public File getFile(String path, boolean pdf, List<File> fileTempList) throws Exception;
+    Map<String, String> filePreviewByAttachmentId(Long attachmentId, Boolean isExpire);
 
     /**
-     * 下载文件到本地
+     * 题卡html文件上传,读取文件内容
      *
-     * @param rootPath   保存目录
-     * @param attachment 附件表对象
-     * @return
+     * @param path 文件地址
      */
-    public File copyFile(String rootPath, String fileName, BasicAttachment attachment) throws Exception;
+    String readFileContent(String path);
 
     /**
-     * 下载文件到本地并压缩返回
+     * 获取文件
      *
-     * @param filePath    文件根目录
-     * @param zipRootPath zip文件根目录
+     * @param path         文件地址
+     * @param pdf          是否为pdf文件
+     * @param fileTempList 临时文件集合
      */
-    public void downloadFileAndZip(HttpServletResponse response, String filePath, String zipRootPath, String zipFileName);
+    File getFile(String path, boolean pdf, List<File> fileTempList) throws Exception;
 
     /**
      * 根据orgId查询所有子机构ID集合
      *
-     * @return
+     * @param orgId 机构ID
      */
-    public Set<Long> listSubOrgIds(Long orgId);
+    Set<Long> listSubOrgIds(Long orgId);
 
     /**
      * 登录公用
      *
-     * @param password
-     * @param sysUser
-     * @param appSource
-     * @return
+     * @param password  密码
+     * @param sysUser   用户对象
+     * @param appSource 来源
      */
-    public LoginResult login(String password, SysUser sysUser, AppSourceEnum appSource) throws NoSuchAlgorithmException;
+    LoginResult login(String password, SysUser sysUser, AppSourceEnum appSource) throws NoSuchAlgorithmException;
 
     /**
-     * 根据编码类型获取系统编码
-     * @param type 编码类型
-     * @return 系统编码
-     */
-    /**
+     * /**
      * 根据编码类型获取系统编码
      *
      * @param type        编码类型
      * @param requestUser 请求的用户
      * @return 系统编码
      */
-    public String getSysIncrCode(SystemCodeEnum type, SysUser requestUser);
+    String getSysIncrCode(SystemCodeEnum type, SysUser requestUser);
 
     /**
      * 校验用户是否包含某权限

+ 3 - 84
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/TeachcloudCommonServiceImpl.java

@@ -23,7 +23,6 @@ import com.qmth.teachcloud.common.enums.*;
 import com.qmth.teachcloud.common.service.*;
 import com.qmth.teachcloud.common.util.*;
 import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -35,7 +34,9 @@ import org.springframework.util.LinkedMultiValueMap;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
-import java.io.*;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
 import java.security.NoSuchAlgorithmException;
 import java.util.*;
@@ -644,56 +645,6 @@ public class TeachcloudCommonServiceImpl implements TeachcloudCommonService {
         return file;
     }
 
-    @Override
-    public File copyFile(String rootPath, String fileName, BasicAttachment attachment) throws Exception {
-        JSONObject object = JSONObject.parseObject(attachment.getPath());
-        String filePath = object.getString(SystemConstant.PATH);
-        String type = object.getString(SystemConstant.TYPE);
-        UploadFileEnum uploadType = Enum.valueOf(UploadFileEnum.class, (String) object.get(SystemConstant.UPLOAD_TYPE));
-
-        File localPath = new File(rootPath, fileName);
-        if (!localPath.exists()) {
-            localPath.getParentFile().mkdirs();
-        }
-        if (type.equals(SystemConstant.OSS)) {
-            return fileStoreUtil.ossDownload(filePath, localPath.getPath(), uploadType.getFssType());
-        } else {
-            if (filePath.contains(dictionaryConfig.fssPublicDomain().getConfig()) || filePath.contains(dictionaryConfig.fssPrivateDomain().getConfig())) {
-                File file = new File(filePath);
-                FileUtils.copyFile(file, localPath);
-                return file;
-            } else {
-                return fileStoreUtil.ossDownload(filePath, localPath.getPath(), uploadType.getFssType());
-            }
-        }
-    }
-
-    /**
-     * 下载文件到本地并压缩返回
-     *
-     * @param rootPath    文件根目录
-     * @param zipRootPath zip文件根目录
-     */
-    @Override
-    public void downloadFileAndZip(HttpServletResponse response, String rootPath, String zipRootPath, String zipFileName) {
-        if (StringUtils.isBlank(zipFileName)) {
-            long time = System.currentTimeMillis();
-            zipFileName = time + SystemConstant.ZIP_PREFIX;
-        }
-        File zipFile = new File(rootPath, zipFileName);
-        try {
-            Zip4jUtil.zipEncryptFile(zipFile.getPath(), zipRootPath, SystemConstant.ZIP_ENCRYPT_PWD);
-            outputFile(response, zipFile, zipFile.getName());
-        } catch (Exception e) {
-            throw ExceptionResultEnum.ERROR.exception("下载失败");
-        } finally {
-            // 删除zip文件
-            FileUtil.deleteFile(zipFile);
-            // 删除压缩内容
-            FileUtil.deleteFile(rootPath);
-        }
-    }
-
     @Override
     public Set<Long> listSubOrgIds(Long id) {
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
@@ -851,38 +802,6 @@ public class TeachcloudCommonServiceImpl implements TeachcloudCommonService {
         return stringSet;
     }
 
-    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);
-//            }
-            IOUtils.copy(br, response.getOutputStream());
-            br.close();
-//            outStream.close();
-        } catch (FileNotFoundException e) {
-            log.error(SystemConstant.LOG_ERROR, e);
-        } catch (IOException e) {
-            log.error(SystemConstant.LOG_ERROR, e);
-        }
-    }
-
     @Override
     public List<String> filePreview(List<String> paths) {
         List<String> result = new ArrayList<String>();

+ 42 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/util/FileUtil.java

@@ -5,6 +5,7 @@ import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import org.apache.commons.codec.digest.DigestUtils;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.web.multipart.MultipartFile;
@@ -638,4 +639,45 @@ public class FileUtil {
         }
     }
 
+    /**
+     * 生成文本文件
+     *
+     * @param file    文件
+     * @param content 要生成的文件内容
+     */
+    public static File writeContent(File file, String content) {
+        try {
+            if (!file.exists()) {
+                file.getParentFile().mkdirs();
+                file.createNewFile();
+            }
+            IOUtils.write(content.getBytes(StandardCharsets.UTF_8), new FileOutputStream(file));
+        } catch (Exception e) {
+            log.error(SystemConstant.LOG_ERROR, e);
+        }
+        return file;
+    }
+
+    /**
+     * 下载加密zip文件
+     *
+     * @param response         response
+     * @param downloadPathFile 压缩文件所在文件夹路径
+     * @param zipFileName      压缩zip文件路径+文件名
+     */
+    public static void downloadEncryptZip(HttpServletResponse response, File downloadPathFile, String zipFileName) {
+        // 压缩zip文件和图片保存文件夹放在同一级
+        File zipFile = new File(downloadPathFile.getParent(), zipFileName);
+        try {
+            // 压缩zip文件路径+文件名
+            String zipFilePath = zipFile.getPath();
+            // 待压缩文件所在文件夹
+            String zipFilesPath = downloadPathFile.getPath();
+            Zip4jUtil.zipEncryptFile(zipFilePath, zipFilesPath, SystemConstant.ZIP_ENCRYPT_PWD);
+            FileUtil.outputFile(response, zipFile, zipFile.getName());
+        } catch (Exception e) {
+            throw ExceptionResultEnum.ERROR.exception("下载失败");
+        }
+    }
+
 }