瀏覽代碼

新增模式4答题卡管理

wangliang 3 月之前
父節點
當前提交
2dd5419d57

+ 21 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/ExamCardModelFour.java

@@ -2,6 +2,7 @@ package com.qmth.distributed.print.business.entity;
 
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.distributed.print.business.bean.params.GenericExamCardModelFourParams;
 import com.qmth.distributed.print.business.enums.ExamCardStatusEnum;
 import com.qmth.teachcloud.common.base.BaseEntity;
 import io.swagger.annotations.ApiModel;
@@ -65,6 +66,26 @@ public class ExamCardModelFour extends BaseEntity implements Serializable {
     @ApiModelProperty(value = "备注")
     private String remark;
 
+    public ExamCardModelFour() {
+
+    }
+
+    public ExamCardModelFour(Long schoolId, Long userId) {
+        this.insertInfo(userId);
+        this.schoolId = schoolId;
+        this.enable = true;
+    }
+
+    public void updateInformation(GenericExamCardModelFourParams params) {
+        this.title = params.getTitle();
+        this.cardRuleId = params.getCardRuleId();
+        this.status = params.getStatus();
+        this.remark = params.getRemark();
+        this.pageSize = params.getPageSize();
+        this.examId = params.getExamId();
+        this.courseId = params.getCourseId();
+    }
+
     public Long getSchoolId() {
         return schoolId;
     }

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

@@ -1,7 +1,10 @@
 package com.qmth.distributed.print.business.service;
 
-import com.qmth.distributed.print.business.entity.ExamCardModelFour;
 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 java.util.Map;
 
 /**
  * <p>
@@ -13,4 +16,20 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface ExamCardModelFourService extends IService<ExamCardModelFour> {
 
+    /**
+     * 新增/修改模式4题卡
+     *
+     * @param params
+     * @return
+     * @throws Exception
+     */
+    Map<String, String> saveGeneric(GenericExamCardModelFourParams params) throws Exception;
+
+    /**
+     * 创建jpg图片
+     *
+     * @param examCardModelFour
+     * @return
+     */
+    ExamCardModelFour createJpgImage(ExamCardModelFour examCardModelFour);
 }

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

@@ -1,10 +1,42 @@
 package com.qmth.distributed.print.business.service.impl;
 
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.boot.core.concurrent.service.ConcurrentService;
+import com.qmth.distributed.print.business.bean.params.GenericExamCardModelFourParams;
+import com.qmth.distributed.print.business.entity.BasicCardRule;
 import com.qmth.distributed.print.business.entity.ExamCardModelFour;
+import com.qmth.distributed.print.business.enums.CardTypeEnum;
+import com.qmth.distributed.print.business.enums.ExamCardStatusEnum;
 import com.qmth.distributed.print.business.mapper.ExamCardModelFourMapper;
+import com.qmth.distributed.print.business.service.BasicCardRuleService;
 import com.qmth.distributed.print.business.service.ExamCardModelFourService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+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.teachcloud.common.bean.marking.ConvertJpgStorage;
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.BasicCourse;
+import com.qmth.teachcloud.common.entity.SysUser;
+import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
+import com.qmth.teachcloud.common.service.BasicCourseService;
+import com.qmth.teachcloud.common.service.FileUploadService;
+import com.qmth.teachcloud.common.util.FileUtil;
+import com.qmth.teachcloud.common.util.ServletUtil;
+import com.qmth.teachcloud.mark.enums.LockType;
+import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
 
 /**
  * <p>
@@ -17,4 +49,129 @@ import org.springframework.stereotype.Service;
 @Service
 public class ExamCardModelFourServiceImpl extends ServiceImpl<ExamCardModelFourMapper, ExamCardModelFour> implements ExamCardModelFourService {
 
+    @Resource
+    ConcurrentService concurrentService;
+
+    @Resource
+    BasicCardRuleService basicCardRuleService;
+
+    @Resource
+    BasicCourseService basicCourseService;
+
+    @Resource
+    CreatePdfUtil createPdfUtil;
+
+    @Resource
+    FileUploadService fileUploadService;
+
+    @Resource
+    HtmlToJpgUtil htmlToJpgUtil;
+
+    /**
+     * 新增/修改模式4题卡
+     *
+     * @param params
+     * @return
+     * @throws Exception
+     */
+    @Override
+    @Transactional
+    public Map<String, String> saveGeneric(GenericExamCardModelFourParams params) throws Exception {
+        Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+
+        ExamCardModelFour examCardModelFour = null;
+        concurrentService.getReadWriteLock(LockType.CUSTOM_MODEL_FOUR_CARD_SAVE + "-" + schoolId + CardTypeEnum.CUSTOM + params.getTitle()).writeLock().tryLock();
+        try {
+            QueryWrapper<ExamCardModelFour> checkTitleQueryWrapper = new QueryWrapper<>();
+            checkTitleQueryWrapper.lambda().eq(ExamCardModelFour::getSchoolId, schoolId)
+                    .eq(ExamCardModelFour::getTitle, params.getTitle().trim());
+            ExamCardModelFour checkTitleExamCardModelFourDb = this.getOne(checkTitleQueryWrapper);
+
+            // 新增
+            if (Objects.isNull(params.getId())) {
+                if (Objects.nonNull(checkTitleExamCardModelFourDb)) {
+                    throw ExceptionResultEnum.ERROR.exception("题卡名称已使用");
+                }
+                examCardModelFour = new ExamCardModelFour(schoolId, sysUser.getId());
+            }
+            // 修改
+            else {
+                examCardModelFour = this.getById(params.getId());
+                if (Objects.nonNull(checkTitleExamCardModelFourDb) && params.getId().longValue() != examCardModelFour.getId().longValue()) {
+                    throw ExceptionResultEnum.ERROR.exception("题卡名称重复");
+                }
+                examCardModelFour.updateInfo(sysUser.getId());
+            }
+            examCardModelFour.updateInformation(params);
+            try {
+                // content文件
+                String contentMd5 = DigestUtils.md5Hex(params.getContentFile().getBytes());
+                if (!Objects.equals(contentMd5, params.getContentMd5())) {
+                    throw ExceptionResultEnum.MD5_EQUALS_FALSE.exception();
+                }
+                String content = SystemConstant.readContent(params.getContentFile().getInputStream());
+
+                if (ExamCardStatusEnum.SUBMIT.equals(params.getStatus())) {
+                    examCardModelFour.setContent(content);
+                    examCardModelFour.setStageContent(null);
+
+                    // content文件
+                    String htmlMd5 = DigestUtils.md5Hex(params.getHtmlContentFile().getBytes());
+                    if (!Objects.equals(htmlMd5, params.getHtmlContentMd5())) {
+                        throw ExceptionResultEnum.MD5_EQUALS_FALSE.exception();
+                    }
+                    String htmlContent = SystemConstant.readContent(params.getHtmlContentFile().getInputStream());
+                    examCardModelFour.setHtmlContent(htmlContent);
+                } else {
+                    examCardModelFour.setStageContent(content);
+                }
+            } catch (IOException e) {
+                throw ExceptionResultEnum.ERROR.exception("题卡内容文件解析失败");
+            }
+
+            if (ExamCardStatusEnum.SUBMIT.equals(params.getStatus())) {
+                // 生成题卡图片
+                createJpgImage(examCardModelFour);
+            }
+            this.saveOrUpdate(examCardModelFour);
+            Map<String, String> map = new HashMap<>();
+            map.put("id", String.valueOf(examCardModelFour.getId()));
+            map.put("title", examCardModelFour.getTitle());
+            return map;
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        } finally {
+            concurrentService.getReadWriteLock(LockType.CUSTOM_MODEL_FOUR_CARD_SAVE + "-" + schoolId + CardTypeEnum.CUSTOM + params.getTitle()).writeLock().unlock();
+        }
+    }
+
+    /**
+     * 创建jpg图片
+     *
+     * @param examCardModelFour
+     * @return
+     */
+    @Override
+    public ExamCardModelFour createJpgImage(ExamCardModelFour examCardModelFour) {
+        BasicCardRule basicCardRule = basicCardRuleService.getById(examCardModelFour.getCardRuleId());
+        BasicCourse basicCourse = examCardModelFour.getCourseId() != null ? basicCourseService.getById(examCardModelFour.getCourseId()) : null;
+        String replaceBackupCardHtmlContent = createPdfUtil.replaceBackupCardHtmlParam(basicCourse != null ? basicCourse.getCode() : null, examCardModelFour, null, basicCardRule, null);
+        File pdfFile = PdfUtil.htmlToPdf(examCardModelFour.getPageSize(), replaceBackupCardHtmlContent);
+        try {
+            List<ConvertJpgStorage> convertJpgStorageList = htmlToJpgUtil.convertPdfToJpg(examCardModelFour.getId(), pdfFile, examCardModelFour.getCreateId());
+            if (CollectionUtils.isNotEmpty(convertJpgStorageList) && convertJpgStorageList.size() > 0) {
+                examCardModelFour.setJpgAttachment(JSON.toJSONString(convertJpgStorageList));
+            } else {
+                examCardModelFour.setJpgAttachment(null);
+            }
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        } finally {
+            if (pdfFile.exists()) {
+                FileUtil.deleteFile(pdfFile);
+            }
+        }
+        return examCardModelFour;
+    }
 }

+ 10 - 4
distributed-print-business/src/main/java/com/qmth/distributed/print/business/util/CreatePdfUtil.java

@@ -32,7 +32,6 @@ import com.qmth.teachcloud.common.service.BasicCourseService;
 import com.qmth.teachcloud.common.service.BasicSemesterService;
 import com.qmth.teachcloud.common.service.FileUploadService;
 import com.qmth.teachcloud.common.util.FileUtil;
-import io.swagger.models.auth.In;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
@@ -639,13 +638,20 @@ public class CreatePdfUtil {
     /**
      * 通用题卡html
      *
-     * @param examCard          examCard
+     * @param Object            o
      * @param paperType         卷型
      * @param basicCardRule     题卡规则
      * @param backupPackageCode 备用题卡条码号
      */
-    public String replaceBackupCardHtmlParam(String courseCode, ExamCard examCard, String paperType, BasicCardRule basicCardRule, String backupPackageCode) {
-        String htmlContent = examCard.getHtmlContent();
+    public String replaceBackupCardHtmlParam(String courseCode, Object o, String paperType, BasicCardRule basicCardRule, String backupPackageCode) {
+        ExamCard examCard = null;
+        ExamCardModelFour examCardModelFour = null;
+        if (o instanceof ExamCard) {
+            examCard = (ExamCard) o;
+        } else if (o instanceof ExamCardModelFour) {
+            examCardModelFour = (ExamCardModelFour) o;
+        }
+        String htmlContent = Objects.nonNull(examCard) ? examCard.getHtmlContent() : examCardModelFour.getHtmlContent();
         // 替换条码参数
         htmlContent = htmlContent.replaceAll("<img src=\"data:image/png;base64,\\$\\{examNumber\\}\">", "");
         htmlContent = htmlContent.replaceAll("\\$\\{examNumberStr\\}", "");

+ 1 - 2
distributed-print/src/main/java/com/qmth/distributed/print/api/ExamCardModelFourController.java

@@ -3,7 +3,6 @@ package com.qmth.distributed.print.api;
 
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.distributed.print.business.bean.params.GenericExamCardModelFourParams;
-import com.qmth.distributed.print.business.bean.params.GenericExamCardParams;
 import com.qmth.distributed.print.business.bean.result.EditResult;
 import com.qmth.distributed.print.business.service.ExamCardModelFourService;
 import com.qmth.teachcloud.common.annotation.OperationLogDetail;
@@ -65,7 +64,7 @@ public class ExamCardModelFourController {
         if (bindingResult.hasErrors()) {
             return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
         }
-        return ResultUtil.ok();
+        return ResultUtil.ok(examCardModelFourService.saveGeneric(params));
     }
 
     @ApiOperation(value = "删除")

+ 1 - 1
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/enums/LockType.java

@@ -22,7 +22,7 @@ public enum LockType {
     CREATE_PDF("create_pdf"),
     EXAM_TASK_WHOLE("exam_task_whole"),
     CUSTOM_CARD_SAVE("custom_card_save"),
-	;
+    CUSTOM_MODEL_FOUR_CARD_SAVE("custom_model_four_card_save");
 
 	private String name;