Przeglądaj źródła

3.4.4 update-20250319,印品A4转A3

xiaofei 3 miesięcy temu
rodzic
commit
0debbde8a5

+ 13 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/BasicTemplate.java

@@ -91,6 +91,11 @@ public class BasicTemplate extends BaseEntity implements Serializable {
      * 备注
      */
     private String remark;
+    /**
+     * 是否转成A3
+     */
+    private Boolean convertA3;
+
 
     @JsonSerialize(using = ToStringSerializer.class)
     @TableField(exist = false)
@@ -230,4 +235,12 @@ public class BasicTemplate extends BaseEntity implements Serializable {
     public void setUrl(String url) {
         this.url = url;
     }
+
+    public Boolean getConvertA3() {
+        return convertA3;
+    }
+
+    public void setConvertA3(Boolean convertA3) {
+        this.convertA3 = convertA3;
+    }
 }

+ 3 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamCardModelFourService.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.qmth.distributed.print.business.bean.params.GenericExamCardModelFourParams;
 import com.qmth.distributed.print.business.entity.ExamCardModelFour;
+import com.qmth.teachcloud.mark.entity.MarkPaper;
 
 import java.util.List;
 import java.util.Map;
@@ -89,4 +90,6 @@ public interface ExamCardModelFourService extends IService<ExamCardModelFour> {
     ExamCardModelFour getByExamIdAndCourseId(Long examId, Long courseId);
 
     void validCourse(GenericExamCardModelFourParams params);
+
+    void saveQuestionAndAnswerCard(ExamCardModelFour examCardModelFour, MarkPaper markPaper, Long userId);
 }

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

@@ -164,7 +164,7 @@ public interface PrintCommonService {
      */
     public void updateGradeBatchStatus(Long schoolId, Long examId, String paperNumber, String paperType);
 
-    void saveAttachmentPackagePdf(PdfPackageDto pdfPackageDto, ExamDetail examDetail, Integer printCount);
+    void saveAttachmentPackagePdf(PdfPackageDto pdfPackageDto, ExamDetail examDetail, Integer printCount, BasicTemplate basicTemplate);
 
     String parseAttachmentPath(String attachmentPath, PrintPathVo printPathVo);
 

+ 6 - 3
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/BasicExamStudentServiceImpl.java

@@ -88,7 +88,7 @@ public class BasicExamStudentServiceImpl extends ServiceImpl<BasicExamStudentMap
     @Resource
     private ExamStudentService examStudentService;
     @Resource
-    private BasicCardRuleService basicCardRuleService;
+    private ExamCardModelFourService examCardModelFourService;
     @Resource
     private TBTaskService tbTaskService;
     @Resource
@@ -496,6 +496,9 @@ public class BasicExamStudentServiceImpl extends ServiceImpl<BasicExamStudentMap
                 String paperType = SystemConstant.DEFAULT_PAPER_TYPE_A;
                 markPaper = new MarkPaper(examId, basicExamStudent.getCourseId(), entry.getKey(), String.valueOf(SystemConstant.getDbUuid()), createId, 1, paperType);
                 markPaperService.save(markPaper);
+
+                // 保存模式4题卡
+                examCardModelFourService.saveQuestionAndAnswerCard(null, markPaper, createId);
             }
             if (markPaper != null) {
                 List<MarkStudent> markStudentList = new ArrayList<>();
@@ -624,7 +627,7 @@ public class BasicExamStudentServiceImpl extends ServiceImpl<BasicExamStudentMap
                 if (StringUtils.isBlank(tSyncDataStudent.getCourseCollegeName())) {
                     throw ExceptionResultEnum.ERROR.exception("课程开课学院必填");
                 }
-                if(needPaperNumber && StringUtils.isBlank(tSyncDataStudent.getPaperNumber())){
+                if (needPaperNumber && StringUtils.isBlank(tSyncDataStudent.getPaperNumber())) {
                     throw ExceptionResultEnum.ERROR.exception("试卷编号必填");
                 }
                 if (StringUtils.isBlank(tSyncDataStudent.getStudentName())) {
@@ -797,7 +800,7 @@ public class BasicExamStudentServiceImpl extends ServiceImpl<BasicExamStudentMap
         QueryWrapper<BasicExamStudent> queryWrapper = new QueryWrapper<>();
         queryWrapper.lambda().eq(BasicExamStudent::getExamId, examId)
                 .eq(BasicExamStudent::getCourseId, courseId)
-                .eq(BasicExamStudent::getStudentCode,studentCode);
+                .eq(BasicExamStudent::getStudentCode, studentCode);
         return this.getOne(queryWrapper);
     }
 }

+ 20 - 13
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamCardModelFourServiceImpl.java

@@ -191,19 +191,8 @@ public class ExamCardModelFourServiceImpl extends ServiceImpl<ExamCardModelFourM
                 createJpgImage(examCardModelFour);
 
                 List<MarkPaper> markPaperList = markPaperService.listByExamIdAndCourseIdForModel4(examCardModelFour.getExamId(), examCardModelFour.getCourseId());
-                if (CollectionUtils.isEmpty(markPaperList)) {
-                    throw ExceptionResultEnum.ERROR.exception("未找到试卷信息");
-                }
-                if (markPaperList.size() > 1) {
-                    throw ExceptionResultEnum.ERROR.exception("找到多条试卷信息");
-                }
-                ExamDetailCourseInitMarkDto dto = new ExamDetailCourseInitMarkDto(examCardModelFour, markPaperList.get(0), sysUser.getId());
-                // 解析卡格式中试卷结构并保存
-                printFinishService.insertMarkQuestion(dto.getExamId(), dto.getCourseId(), dto.getPaperNumber(), examCardModelFour.getContent(), null);
-                // 生成并保存卡格式文件(后缀为.json)
-                ScanAnswerCard scanAnswerCard = printFinishService.insertScanAnswerCard(dto, examCardModelFour.getId().toString(), examCardModelFour.getContent());
-                if (Objects.nonNull(scanAnswerCard)) {
-                    printFinishService.insertScanAnswerCardQuestion(dto.getExamId(), dto.getPaperNumber(), examCardModelFour.getContent(), scanAnswerCard.getNumber());
+                if (CollectionUtils.isNotEmpty(markPaperList) && markPaperList.size() == 1) {
+                    saveQuestionAndAnswerCard(examCardModelFour, markPaperList.get(0), sysUser.getId());
                 }
             }
             this.saveOrUpdate(examCardModelFour);
@@ -436,6 +425,24 @@ public class ExamCardModelFourServiceImpl extends ServiceImpl<ExamCardModelFourM
         }
     }
 
+    @Override
+    public void saveQuestionAndAnswerCard(ExamCardModelFour examCardModelFour, MarkPaper markPaper, Long userId) {
+        if (examCardModelFour == null) {
+            examCardModelFour = this.getByExamIdAndCourseId(markPaper.getExamId(), markPaper.getCourseId());
+        }
+        if (examCardModelFour == null) {
+            return;
+        }
+        ExamDetailCourseInitMarkDto dto = new ExamDetailCourseInitMarkDto(examCardModelFour, markPaper, userId);
+        // 解析卡格式中试卷结构并保存
+        printFinishService.insertMarkQuestion(dto.getExamId(), dto.getCourseId(), dto.getPaperNumber(), examCardModelFour.getContent(), null);
+        // 生成并保存卡格式文件(后缀为.json)
+        ScanAnswerCard scanAnswerCard = printFinishService.insertScanAnswerCard(dto, examCardModelFour.getId().toString(), examCardModelFour.getContent());
+        if (Objects.nonNull(scanAnswerCard)) {
+            printFinishService.insertScanAnswerCardQuestion(dto.getExamId(), dto.getPaperNumber(), examCardModelFour.getContent(), scanAnswerCard.getNumber());
+        }
+    }
+
     /**
      * 创建zip
      *

+ 26 - 6
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/PrintCommonServiceImpl.java

@@ -135,6 +135,7 @@ public class PrintCommonServiceImpl implements PrintCommonService {
     @Transactional
     public void saveAttachmentSignPdf(PdfSignDto pdfFillDto, ExamDetail examDetail, Integer printCount, BasicTemplate basicTemplate) {
         File pdfFileTemp = null;
+        File pdfFileTempA3 = null;
         try {
             boolean oss = dictionaryConfig.sysDomain().isOss();
             StringJoiner pdfStringJoiner = new StringJoiner("");
@@ -146,14 +147,20 @@ public class PrintCommonServiceImpl implements PrintCommonService {
             pdfStringJoiner.add(PdfUtil.md5FileName(CreatePdfTypeEnum.SIGN.name() + examDetail.getId())).add(SystemConstant.PDF_PREFIX);
 
             pdfFileTemp = SystemConstant.getFileTempVar(SystemConstant.PDF_PREFIX);
+            pdfFileTempA3 = SystemConstant.getFileTempVar(SystemConstant.PDF_PREFIX);
             pdfFileTemp = createPrintPdfUtil.createSignPdf(pdfFillDto, pdfFileTemp.getPath(), basicTemplate);
-            // 校验签到表是否自动分页。2页及以上的pdf,每页后面都需要补一个空白页
-            // 补空白页
-            if (basicTemplate != null && basicTemplate.getAddBlankPage()) {
+            if (basicTemplate != null) {
+                if (basicTemplate.getConvertA3()) {
+                    pdfFileTemp = PDFConverter.pdfA4ToA3(pdfFileTemp, pdfFileTempA3);
+                }
+                // 校验签到表是否自动分页。2页及以上的pdf,每页后面都需要补一个空白页
                 // 补空白页
-                PdfUtil.addPdfEmptyPage(pdfFileTemp);
-            }
+                if (basicTemplate.getAddBlankPage()) {
+                    // 补空白页
+                    PdfUtil.addPdfEmptyPage(pdfFileTemp);
+                }
 
+            }
             String pdfDirName = FileUtil.replaceSplit(pdfStringJoiner.toString());
             //pdf生成和上传
             String pdfFileMd5 = DigestUtils.md5Hex(new FileInputStream(pdfFileTemp));
@@ -181,6 +188,9 @@ public class PrintCommonServiceImpl implements PrintCommonService {
             if (pdfFileTemp != null) {
                 FileUtil.deleteFile(pdfFileTemp);
             }
+            if (pdfFileTempA3 != null) {
+                FileUtil.deleteFile(pdfFileTempA3);
+            }
         }
     }
 
@@ -1015,8 +1025,9 @@ public class PrintCommonServiceImpl implements PrintCommonService {
     }
 
     @Override
-    public void saveAttachmentPackagePdf(PdfPackageDto pdfPackageDto, ExamDetail examDetail, Integer printCount) {
+    public void saveAttachmentPackagePdf(PdfPackageDto pdfPackageDto, ExamDetail examDetail, Integer printCount, BasicTemplate basicTemplate) {
         File pdfFileTemp = null;
+        File pdfFileTempA3 = null;
         try {
             boolean oss = dictionaryConfig.sysDomain().isOss();
             StringJoiner pdfStringJoiner = new StringJoiner("");
@@ -1029,7 +1040,13 @@ public class PrintCommonServiceImpl implements PrintCommonService {
 
             String pdfDirName = FileUtil.replaceSplit(pdfStringJoiner.toString());
             pdfFileTemp = SystemConstant.getFileTempVar(SystemConstant.PDF_PREFIX);
+            pdfFileTempA3 = SystemConstant.getFileTempVar(SystemConstant.PDF_PREFIX);
             createPrintPdfUtil.createPackagePdf(pdfPackageDto, pdfFileTemp.getPath());
+            if (basicTemplate != null) {
+                if (basicTemplate.getConvertA3()) {
+                    pdfFileTemp = PDFConverter.pdfA4ToA3(pdfFileTemp, pdfFileTempA3);
+                }
+            }
             //pdf生成和上传
             String pdfFileMd5 = DigestUtils.md5Hex(new FileInputStream(pdfFileTemp));
             if (oss || (!oss && dictionaryConfig.fssPrivateDomain().getConfig().startsWith(SystemConstant.START_PARENT))) {
@@ -1058,6 +1075,9 @@ public class PrintCommonServiceImpl implements PrintCommonService {
             if (pdfFileTemp != null) {
                 FileUtil.deleteFile(pdfFileTemp);
             }
+            if (pdfFileTempA3 != null) {
+                FileUtil.deleteFile(pdfFileTempA3);
+            }
         }
     }
 }

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

@@ -212,7 +212,7 @@ public class CreatePdfUtil {
             basicPlate.add(basicValue);
         }
         pdfPackageDto.setBasicPlate(basicPlate);
-        printCommonService.saveAttachmentPackagePdf(pdfPackageDto, examDetail, printCount);
+        printCommonService.saveAttachmentPackagePdf(pdfPackageDto, examDetail, printCount, basicTemplate);
     }
 
     /**
@@ -637,11 +637,6 @@ public class CreatePdfUtil {
 
     /**
      * 通用题卡html
-     *
-     * @param Object            o
-     * @param paperType         卷型
-     * @param basicCardRule     题卡规则
-     * @param backupPackageCode 备用题卡条码号
      */
     public String replaceBackupCardHtmlParam(String courseCode, Object o, String paperType, BasicCardRule basicCardRule, String backupPackageCode) {
         ExamCard examCard = null;

+ 4 - 0
distributed-print/install/mysql/upgrade/3.4.4.sql

@@ -326,3 +326,7 @@ update mark_question mq left join mark_paper mp on mq.exam_id = mp.exam_id and m
 INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('1217', '课程唯一性校验', '/api/admin/exam/model_4/card/valid_course', 'URL', '1199', '8', 'AUTH', '1', '1', '1');
 UPDATE `sys_privilege` SET `related` = '1210,1217' WHERE (`id` = '1201');
 UPDATE `sys_privilege` SET `related` = '1210,1217' WHERE (`id` = '1206');
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `related`, `enable`, `default_auth`, `front_display`) VALUES ('1218', '复核记录导出', 'ExportScoreHistory', 'BUTTON', '946', '14', 'AUTH', '1219', '1', '0', '1');
+INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('1219', '复核记录导出', '/api/admin/mark/archive/score/history/export', 'URL', '946', '14', 'AUTH', '1', '1', '1');
+ALTER TABLE `basic_template` ADD COLUMN `convert_a3` TINYINT(1) NULL DEFAULT 0 COMMENT '是否转换成A3' AFTER `font_size`;
+

+ 36 - 5
teachcloud-common/src/main/java/com/qmth/teachcloud/common/util/PDFConverter.java

@@ -3,21 +3,52 @@ package com.qmth.teachcloud.common.util;
 
 import com.itextpdf.text.Document;
 import com.itextpdf.text.PageSize;
-import com.itextpdf.text.Paragraph;
 import com.itextpdf.text.Rectangle;
-import com.itextpdf.text.pdf.*;
+import com.itextpdf.text.pdf.PdfContentByte;
+import com.itextpdf.text.pdf.PdfImportedPage;
+import com.itextpdf.text.pdf.PdfReader;
+import com.itextpdf.text.pdf.PdfWriter;
 
 import java.io.File;
+import java.io.FileInputStream;
 import java.io.FileOutputStream;
-import java.io.IOException;
 
 public class PDFConverter {
-    public static void main(String[] args) throws IOException {
 
+    public static File pdfA4ToA3(File sourceFile, File pdfFileTempA3) {
+        try {
+            // 创建A3横向页面尺寸
+            Rectangle a3Landscape = PageSize.A3.rotate();
+            // 初始化文档和写入器
+            Document document = new Document(a3Landscape);
+            PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(pdfFileTempA3));
+            document.open();
+
+            // 读取源PDF
+            PdfReader reader = new PdfReader(new FileInputStream(sourceFile));
+            // 遍历所有页面
+            for (int i = 1; i <= reader.getNumberOfPages(); i++) {
+                // 创建新A3页面
+                document.newPage();
+                // 获取当前页内容
+                PdfImportedPage importedPage = writer.getImportedPage(reader, i);
+                // 获取画布对象
+                PdfContentByte content = writer.getDirectContent();
+                // 将A4页面添加到A3左半边(原点在左下角)
+                content.addTemplate(importedPage, 0, 0); // 直接放置,不缩放
+            }
+            // 关闭资源
+            document.close();
+            reader.close();
+            System.out.println("转换完成!");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
 
+        return pdfFileTempA3;
     }
 
-    private File pdfA3ToA4(String source) {
+    public static File pdfA4ToA3Test(String source) {
         String inputPdf = "/Users/xiaofei/111.pdf";
         String outputPdf = "/Users/xiaofei/222.pdf";