소스 검색

Merge remote-tracking branch 'origin/dev_v3.3.1' into dev_v3.3.1

caozixuan 1 년 전
부모
커밋
4331ff3d96
23개의 변경된 파일222개의 추가작업 그리고 48개의 파일을 삭제
  1. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamCardService.java
  2. 3 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ActivitiServiceImpl.java
  3. 5 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/BasicExamStudentServiceImpl.java
  4. 8 16
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamCardServiceImpl.java
  5. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskDetailServiceImpl.java
  6. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/GradePaperStructServiceImpl.java
  7. 7 15
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/impl/TaskLogicServiceImpl.java
  8. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/util/HtmlToJpgUtil.java
  9. 1 1
      distributed-print/src/main/java/com/qmth/distributed/print/api/TFCustomFlowController.java
  10. 41 0
      distributed-print/src/test/java/com/qmth/distributed/print/AnswerCardPageImageTest.java
  11. 10 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/marking/CardJpgResult.java
  12. 1 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/marking/ConvertJpgStorage.java
  13. 1 3
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/marking/Question.java
  14. 32 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/marking/scanAnswerCard/AnswerCard.java
  15. 16 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/marking/scanAnswerCard/AnswerCardPage.java
  16. 16 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/marking/scanAnswerCard/AnswerCardPageExchange.java
  17. 15 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/util/RegexUtil.java
  18. 3 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkStudentMapper.java
  19. 2 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkStudentService.java
  20. 3 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/ScanAnswerCardService.java
  21. 5 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkStudentServiceImpl.java
  22. 46 7
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/ScanAnswerCardServiceImpl.java
  23. 3 0
      teachcloud-mark/src/main/resources/mapper/MarkStudentMapper.xml

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

@@ -2,7 +2,7 @@ package com.qmth.distributed.print.business.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.qmth.distributed.print.business.bean.marking.CardJpgResult;
+import com.qmth.teachcloud.common.bean.marking.CardJpgResult;
 import com.qmth.distributed.print.business.bean.params.ExamCardParams;
 import com.qmth.distributed.print.business.bean.params.GenericExamCardParams;
 import com.qmth.distributed.print.business.entity.ExamCard;

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

@@ -1647,6 +1647,9 @@ public class ActivitiServiceImpl implements ActivitiService {
      */
     @Override
     public TaskInfoResult getTaskInfo(Long taskId) {
+        if (taskId == null) {
+            return null;
+        }
         Task task = taskService.createTaskQuery().taskId(String.valueOf(taskId)).singleResult();
         Optional.ofNullable(task).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("流程任务为空或该流程已被他人审核,请刷新再试!"));
         Long flowId = SystemConstant.convertIdToLong(task.getProcessInstanceId());

+ 5 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/BasicExamStudentServiceImpl.java

@@ -22,12 +22,14 @@ import com.qmth.teachcloud.common.service.CommonCacheService;
 import com.qmth.teachcloud.common.service.SysUserService;
 import com.qmth.teachcloud.common.util.ConvertUtil;
 import com.qmth.teachcloud.common.util.ExcelUtil;
+import com.qmth.teachcloud.common.util.RegexUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import com.qmth.teachcloud.mark.entity.MarkPaper;
 import com.qmth.teachcloud.mark.entity.MarkStudent;
 import com.qmth.teachcloud.mark.service.MarkPaperService;
 import com.qmth.teachcloud.mark.service.MarkStudentService;
 import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.RegExUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
@@ -258,6 +260,9 @@ public class BasicExamStudentServiceImpl extends ServiceImpl<BasicExamStudentMap
         if (!SystemConstant.strNotNull(studentCode)) {
             errorMsgList.add("学号必填");
         }
+        if (!RegexUtil.validStudentCode(studentCode)) {
+            errorMsgList.add("学号只能由数字、字母组成");
+        }
         if (!SystemConstant.strNotNull(teachClazz)) {
             errorMsgList.add("教学班必填");
         }

+ 8 - 16
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamCardServiceImpl.java

@@ -7,18 +7,16 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.qmth.distributed.print.business.bean.marking.CardJpgResult;
-import com.qmth.distributed.print.business.bean.marking.ConvertJpgStorage;
+import com.qmth.teachcloud.common.bean.marking.CardJpgResult;
+import com.qmth.teachcloud.common.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;
 import com.qmth.distributed.print.business.enums.MakeMethodEnum;
 import com.qmth.distributed.print.business.mapper.ExamCardMapper;
 import com.qmth.distributed.print.business.service.*;
-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;
@@ -35,17 +33,15 @@ 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 com.qmth.teachcloud.mark.service.ScanAnswerCardService;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.CollectionUtils;
-import org.springframework.util.FileCopyUtils;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
 import java.io.File;
-import java.nio.charset.StandardCharsets;
 import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
@@ -63,34 +59,28 @@ public class ExamCardServiceImpl extends ServiceImpl<ExamCardMapper, ExamCard> i
 
     @Resource
     private BasicExamRuleService basicExamRuleService;
-
     @Resource
     private BasicCardRuleService basicCardRuleService;
-
     @Resource
     private ExamTaskDetailService examTaskDetailService;
-
     @Resource
     private ExamTaskService examTaskService;
-
     @Resource
     private BasicAttachmentService basicAttachmentService;
-
     @Resource
     TeachcloudCommonService teachcloudCommonService;
-
     @Resource
     BasicCourseService basicCourseService;
     @Resource
     HtmlToJpgUtil htmlToJpgUtil;
     @Resource
-    CreatePdfUtil createPdfUtil;
-    @Resource
     BasicRoleDataPermissionService basicRoleDataPermissionService;
     @Resource
     CreatePdfNewUtil createPdfNewUtil;
     @Resource
     private FileUploadService fileUploadService;
+    @Resource
+    private ScanAnswerCardService scanAnswerCardService;
 
     @Transactional
     @Override
@@ -484,7 +474,7 @@ public class ExamCardServiceImpl extends ServiceImpl<ExamCardMapper, ExamCard> i
                 .eq(ExamTask::getExamId, examId)
                 .eq(ExamTask::getPaperNumber, paperNumber));
         if (examTask == null) {
-            return new ArrayList<>();
+            return scanAnswerCardService.listPageImage(examId, paperNumber, paperType);
         }
         Long examTaskId = examTask.getId();
         ExamTaskDetail examTaskDetail = examTaskDetailService.getOne(new QueryWrapper<ExamTaskDetail>().lambda()
@@ -515,6 +505,8 @@ public class ExamCardServiceImpl extends ServiceImpl<ExamCardMapper, ExamCard> i
                     return Stream.of(cardJpgResult);
                 }).collect(Collectors.toList()));
             }
+        } else {
+            return scanAnswerCardService.listPageImage(examId, paperNumber, paperType);
         }
         return cardJpgResultList;
     }

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

@@ -403,7 +403,7 @@ public class ExamTaskDetailServiceImpl extends ServiceImpl<ExamTaskDetailMapper,
             }
 
             // 修改已曝光和未曝光类型
-            List<String> exposedPaperTypeList = new ArrayList<>(Arrays.asList(taskDetail.getExposedPaperType().split(",")));
+            List<String> exposedPaperTypeList = StringUtils.isNotBlank(taskDetail.getExposedPaperType()) ? new ArrayList<>(Arrays.asList(taskDetail.getExposedPaperType().split(","))) : new ArrayList<>();
             List<String> unexposedPaperTypeList = StringUtils.isNotBlank(taskDetail.getUnexposedPaperType()) ? new ArrayList<>(Arrays.asList(taskDetail.getUnexposedPaperType().split(","))) : new ArrayList<>();
             for (String exposePaperType : paperTypeSet) {
                 if (exposedPaperTypeList.contains(exposePaperType)) {

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

@@ -6,7 +6,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.collect.Lists;
 import com.qmth.distributed.print.business.bean.dto.excel.GradePaperStructDto;
 import com.qmth.distributed.print.business.bean.dto.open.PaperStructure;
-import com.qmth.distributed.print.business.bean.marking.Question;
+import com.qmth.teachcloud.common.bean.marking.Question;
 import com.qmth.distributed.print.business.bean.params.analyze.GradePaperStructDatasource;
 import com.qmth.distributed.print.business.bean.params.analyze.GradePaperStructParam;
 import com.qmth.distributed.print.business.bean.result.analyze.GradePaperStructResult;

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

@@ -708,8 +708,6 @@ public class TaskLogicServiceImpl implements TaskLogicService {
         basicCourseList.forEach(e -> {
             courseCodeNameInBasicCourseMap.put(e.getCode(), e.getName());
         });
-        // 考号重复数据次数
-        Map<String, Integer> ticketNumberMap = new HashMap<>();
         // 文件中试卷编号对应多个课程代码
         Map<String, String> paperNumberWithCourseCodeInExcelMap = new HashMap<>();
         // 试卷编号在考试下有多个命题任务map
@@ -763,7 +761,7 @@ public class TaskLogicServiceImpl implements TaskLogicService {
 
                 if (Objects.nonNull(row)) {
                     Cell cell = row.getCell(index);
-                    String cellValue = String.valueOf(ExcelUtil.convert(cell));
+                    String cellValue = cell == null ? null : String.valueOf(ExcelUtil.convert(cell));
                     if (cellValue == null || cellValue.length() < 1 || cellValue.equals("null")) {
                         cellValue = "";
                         errorRowDate.add("第" + (r + 1) + "行,第" + (index + 1) + "列,字段[" + name + "]必填");
@@ -825,8 +823,7 @@ public class TaskLogicServiceImpl implements TaskLogicService {
             String courseCode = examinationImportDto.getCourseCode();
             String courseName = examinationImportDto.getCourseName();
             String paperNumber = examinationImportDto.getPaperNumber();
-//            String ticketNumber = examinationImportDto.getTicketNumber();
-
+            String studentCode = examinationImportDto.getStudentCode();
 
             if (!SystemConstant.isOneNull(courseCode, courseName)) {
                 // 校验1 - 文件中课程代码对应多个不同的课程名称
@@ -846,14 +843,9 @@ public class TaskLogicServiceImpl implements TaskLogicService {
                     errorRowDate.add(String.format("文件中课程代码[%s]对应课程名称为[%s],课程管理中对应课程名称为[%s]", courseCode, courseName, basicName));
                 }
             }
-//            if (!SystemConstant.isOneNull(ticketNumber)) {
-//                // 检验3 - 文件中考号有重复数据
-//                if (ticketNumberMap.containsKey(ticketNumber)) {
-//                    errorRowDate.add("文件中考号[" + ticketNumber + "]有重复数据");
-//                } else {
-//                    ticketNumberMap.put(ticketNumber, 1);
-//                }
-//            }
+            if (!RegexUtil.validStudentCode(studentCode)) {
+                errorRowDate.add("文件中学号[" + studentCode + "]不对,学号只能由数字、字母组成");
+            }
             if (!SystemConstant.isOneNull(paperNumber, courseCode)) {
                 // 检验4 - 文件中试卷编号[%s]对应多个不同的课程代码[%s]
                 if (paperNumberWithCourseCodeInExcelMap.containsKey(paperNumber)) {
@@ -2304,14 +2296,14 @@ public class TaskLogicServiceImpl implements TaskLogicService {
         for (Map.Entry<String, List<BasicExamStudent>> entry : stringMap.entrySet()) {
             BasicExamStudent basicExamStudent = entry.getValue().get(0);
             MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(examId, entry.getKey());
-            if(markPaper == null){
+            if (markPaper == null) {
                 BasicCourse basicCourse = basicCourseService.getByCode(basicExamStudent.getCourseCode());
                 markPaper = new MarkPaper(examId, basicExamStudent.getCourseCode(), basicCourse.getName(), entry.getKey(), String.valueOf(System.currentTimeMillis()), requestUserId, SystemConstant.DEFAULT_PAPER_TYPE_A);
                 markPaperService.save(markPaper);
             }
             Set<String> secretNumberSet = new HashSet<>();
             MarkPaper finalMarkPaper = markPaper;
-            entry.getValue().forEach(m-> markStudentService.updateByBasicExamStudent(m, finalMarkPaper, secretNumberSet));
+            entry.getValue().forEach(m -> markStudentService.updateByBasicExamStudent(m, finalMarkPaper, secretNumberSet));
             markPaperService.updateStudentCountByExamIdAndPaperNumberAndPaperType(examId, entry.getKey(), SystemConstant.DEFAULT_PAPER_TYPE_A);
         }
     }

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

@@ -1,7 +1,7 @@
 package com.qmth.distributed.print.business.util;
 
 import com.alibaba.fastjson.JSON;
-import com.qmth.distributed.print.business.bean.marking.ConvertJpgStorage;
+import com.qmth.teachcloud.common.bean.marking.ConvertJpgStorage;
 import com.qmth.teachcloud.common.bean.vo.FilePathVo;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.BasicAttachment;

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

@@ -315,7 +315,7 @@ public class TFCustomFlowController {
     @ApiOperation(value = "获取当前流程节点信息")
     @ApiResponses({@ApiResponse(code = 200, message = "当前流程节点信息", response = TaskInfoResult.class)})
     @RequestMapping(value = "/task/info", method = RequestMethod.POST)
-    public Result taskInfo(@ApiParam(value = "流程节点id", required = true) @RequestParam String taskId) {
+    public Result taskInfo(@ApiParam(value = "流程节点id") @RequestParam(required = false) String taskId) {
         return ResultUtil.ok(activitiService.getTaskInfo(SystemConstant.convertIdToLong(taskId)));
     }
 

+ 41 - 0
distributed-print/src/test/java/com/qmth/distributed/print/AnswerCardPageImageTest.java

@@ -0,0 +1,41 @@
+package com.qmth.distributed.print;
+
+import com.alibaba.fastjson.JSON;
+import com.qmth.teachcloud.common.bean.marking.CardJpgResult;
+import com.qmth.teachcloud.common.bean.marking.scanAnswerCard.AnswerCard;
+import com.qmth.teachcloud.common.bean.marking.scanAnswerCard.AnswerCardPage;
+import com.qmth.teachcloud.common.util.HttpUtil;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 从卡格式获取图片
+ */
+public class AnswerCardPageImageTest {
+
+    public static void main(String[] args) {
+        List<CardJpgResult> cardJpgResultList = new ArrayList<>();
+        String url = "https://oss-file.qmth.com.cn/teachcloud-dps-dev-private/card/506180312611422208/Z137211/adapt/11.json";
+        try {
+            String jsonContent = HttpUtil.get(url, null, null, null);
+            if (StringUtils.isNotBlank(jsonContent)) {
+                AnswerCard answerCard = JSON.parseObject(jsonContent, AnswerCard.class);
+                if (answerCard != null && CollectionUtils.isNotEmpty(answerCard.getPages())) {
+                    int pageIndex = 1;
+                    for (AnswerCardPage page : answerCard.getPages()) {
+                        if (page.getExchange() != null && StringUtils.isNotBlank(page.getExchange().getPageImage())) {
+                            String pageImage = page.getExchange().getPageImage().replaceAll("\\r\\n", "");
+                            cardJpgResultList.add(new CardJpgResult("page" + pageIndex, pageIndex, "data:image/png;base64," + pageImage));
+                        }
+                    }
+                }
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+}

+ 10 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/marking/CardJpgResult.java → teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/marking/CardJpgResult.java

@@ -1,4 +1,4 @@
-package com.qmth.distributed.print.business.bean.marking;
+package com.qmth.teachcloud.common.bean.marking;
 
 import io.swagger.annotations.ApiModelProperty;
 
@@ -17,6 +17,15 @@ public class CardJpgResult {
     @ApiModelProperty("jpg文件预览路径")
     private String path;
 
+    public CardJpgResult() {
+    }
+
+    public CardJpgResult(String name, Integer index, String path) {
+        this.name = name;
+        this.index = index;
+        this.path = path;
+    }
+
     public String getName() {
         return name;
     }

+ 1 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/marking/ConvertJpgStorage.java → teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/marking/ConvertJpgStorage.java

@@ -1,4 +1,4 @@
-package com.qmth.distributed.print.business.bean.marking;
+package com.qmth.teachcloud.common.bean.marking;
 
 import io.swagger.annotations.ApiModelProperty;
 

+ 1 - 3
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/marking/Question.java → teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/marking/Question.java

@@ -1,10 +1,8 @@
-package com.qmth.distributed.print.business.bean.marking;
+package com.qmth.teachcloud.common.bean.marking;
 
 import io.swagger.annotations.ApiModelProperty;
 
-import javax.annotation.Resource;
 import java.math.BigDecimal;
-import java.math.RoundingMode;
 import java.util.Comparator;
 import java.util.List;
 import java.util.stream.Collectors;

+ 32 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/marking/scanAnswerCard/AnswerCard.java

@@ -0,0 +1,32 @@
+package com.qmth.teachcloud.common.bean.marking.scanAnswerCard;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.List;
+
+/**
+ * 电子卡格式适配文件
+ */
+public class AnswerCard {
+    @ApiModelProperty("是否适配")
+    private Boolean adapted;
+
+    @ApiModelProperty("pages")
+    private List<AnswerCardPage> pages;
+
+    public Boolean getAdapted() {
+        return adapted;
+    }
+
+    public void setAdapted(Boolean adapted) {
+        this.adapted = adapted;
+    }
+
+    public List<AnswerCardPage> getPages() {
+        return pages;
+    }
+
+    public void setPages(List<AnswerCardPage> pages) {
+        this.pages = pages;
+    }
+}

+ 16 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/marking/scanAnswerCard/AnswerCardPage.java

@@ -0,0 +1,16 @@
+package com.qmth.teachcloud.common.bean.marking.scanAnswerCard;
+
+import io.swagger.annotations.ApiModelProperty;
+
+public class AnswerCardPage {
+    @ApiModelProperty("exchange")
+    private AnswerCardPageExchange exchange;
+
+    public AnswerCardPageExchange getExchange() {
+        return exchange;
+    }
+
+    public void setExchange(AnswerCardPageExchange exchange) {
+        this.exchange = exchange;
+    }
+}

+ 16 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/marking/scanAnswerCard/AnswerCardPageExchange.java

@@ -0,0 +1,16 @@
+package com.qmth.teachcloud.common.bean.marking.scanAnswerCard;
+
+import io.swagger.annotations.ApiModelProperty;
+
+public class AnswerCardPageExchange {
+    @ApiModelProperty("图片Base64")
+    private String pageImage;
+
+    public String getPageImage() {
+        return pageImage;
+    }
+
+    public void setPageImage(String pageImage) {
+        this.pageImage = pageImage;
+    }
+}

+ 15 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/util/RegexUtil.java

@@ -0,0 +1,15 @@
+package com.qmth.teachcloud.common.util;
+
+/**
+ * 正则表达式工具类
+ */
+public class RegexUtil {
+
+    /**
+     * 校验学号
+     */
+    public static Boolean validStudentCode(String value) {
+        String regex = "[a-zA-Z0-9]+";
+        return value.matches(regex);
+    }
+}

+ 3 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkStudentMapper.java

@@ -3,6 +3,7 @@ package com.qmth.teachcloud.mark.mapper;
 import java.util.List;
 
 import com.qmth.teachcloud.common.entity.BasicTeachClazz;
+import io.swagger.models.auth.In;
 import org.apache.ibatis.annotations.Param;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
@@ -79,4 +80,6 @@ public interface MarkStudentMapper extends BaseMapper<MarkStudent> {
 			@Param("status") String status, @Param("dpr") DataPermissionRule dpr);
 
 	BasicTeachClazz getBasicTeachClazzById(Long clazzId);
+
+    Integer maxCardNumber(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("paperType") String paperType);
 }

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

@@ -165,4 +165,6 @@ public interface MarkStudentService extends IService<MarkStudent> {
     void updateByBasicExamStudent(BasicExamStudent basicExamStudent, MarkPaper markPaper, Set<String> secretNumberSet);
 
     void deleteByExamIdAndPaperNumberAndStudentCode(Long examId, String paperNumber, String studentCode);
+
+    Integer maxCardNumber(Long examId, String paperNumber, String paperType);
 }

+ 3 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/ScanAnswerCardService.java

@@ -1,5 +1,6 @@
 package com.qmth.teachcloud.mark.service;
 
+import com.qmth.teachcloud.common.bean.marking.CardJpgResult;
 import com.qmth.teachcloud.mark.bean.UriVo;
 import com.qmth.teachcloud.mark.bean.answercard.AnswerCardSaveDomain;
 import com.qmth.teachcloud.mark.bean.answercard.AnswerCardVo;
@@ -41,4 +42,6 @@ public interface ScanAnswerCardService extends IService<ScanAnswerCard> {
     List<ScanAnswerCard> listByExamIdAndPaperNumber(Long examId, String paperNumber);
 
     void deleteByExamIdAndPaperNumber(Long examId, String paperNumber);
+
+    List<CardJpgResult> listPageImage(Long examId, String paperNumber, String paperType);
 }

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

@@ -1595,4 +1595,9 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
                 .eq(MarkStudent::getStudentCode, studentCode);
         this.remove(updateWrapper);
     }
+
+    @Override
+    public Integer maxCardNumber(Long examId, String paperNumber, String paperType) {
+        return this.baseMapper.maxCardNumber(examId, paperNumber, paperType);
+    }
 }

+ 46 - 7
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/ScanAnswerCardServiceImpl.java

@@ -1,18 +1,23 @@
 package com.qmth.teachcloud.mark.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.Update;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.qmth.boot.core.exception.ParameterException;
 import com.qmth.teachcloud.common.bean.dto.DataPermissionRule;
+import com.qmth.teachcloud.common.bean.marking.CardJpgResult;
+import com.qmth.teachcloud.common.bean.marking.scanAnswerCard.AnswerCard;
+import com.qmth.teachcloud.common.bean.marking.scanAnswerCard.AnswerCardPage;
+import com.qmth.teachcloud.common.bean.vo.FilePathVo;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.mark.MarkPaperStatus;
 import com.qmth.teachcloud.common.service.BasicRoleDataPermissionService;
 import com.qmth.teachcloud.common.service.TeachcloudCommonService;
+import com.qmth.teachcloud.common.util.HttpUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import com.qmth.teachcloud.mark.bean.UriVo;
 import com.qmth.teachcloud.mark.bean.answercard.AnswerCardSaveDomain;
@@ -22,12 +27,10 @@ import com.qmth.teachcloud.mark.entity.MarkPaper;
 import com.qmth.teachcloud.mark.entity.ScanAnswerCard;
 import com.qmth.teachcloud.mark.enums.CardSource;
 import com.qmth.teachcloud.mark.mapper.ScanAnswerCardMapper;
-import com.qmth.teachcloud.mark.service.MarkFileService;
-import com.qmth.teachcloud.mark.service.MarkPaperService;
-import com.qmth.teachcloud.mark.service.ScanAnswerCardService;
-import com.qmth.teachcloud.mark.service.ScanPaperService;
+import com.qmth.teachcloud.mark.service.*;
 import com.qmth.teachcloud.mark.utils.FileStoreUtils;
 import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -35,6 +38,7 @@ import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -51,16 +55,16 @@ public class ScanAnswerCardServiceImpl extends ServiceImpl<ScanAnswerCardMapper,
 
     @Autowired
     private MarkPaperService markPaperService;
-
     @Autowired
     private ScanPaperService scanPaperService;
     @Resource
     private MarkFileService markFileService;
     @Resource
+    private MarkStudentService markStudentService;
+    @Resource
     private BasicRoleDataPermissionService basicRoleDataPermissionService;
     @Resource
     private TeachcloudCommonService teachcloudCommonService;
-
     @Resource
     private FileStoreUtils fileStoreUtils;
 
@@ -157,6 +161,8 @@ public class ScanAnswerCardServiceImpl extends ServiceImpl<ScanAnswerCardMapper,
 //        card.setSliceConfig(sliceConfig);
         card.setMd5(domain.getMd5());
         card.setUri(filePath);
+        card.setAdapteMd5(domain.getMd5());
+        card.setAdapteUri(filePath);
         this.saveOrUpdate(card);
         return card;
     }
@@ -272,4 +278,37 @@ public class ScanAnswerCardServiceImpl extends ServiceImpl<ScanAnswerCardMapper,
         this.remove(updateWrapper);
     }
 
+    @Override
+    public List<CardJpgResult> listPageImage(Long examId, String paperNumber, String paperType) {
+        List<CardJpgResult> cardJpgResultList = new ArrayList<>();
+        Integer maxCardNumber = markStudentService.maxCardNumber(examId, paperNumber, paperType);
+        if (maxCardNumber != null) {
+            ScanAnswerCard scanAnswerCard = this.findByExamAndNumber(examId, maxCardNumber);
+            if (scanAnswerCard != null && StringUtils.isNotBlank(scanAnswerCard.getAdapteUri())) {
+                FilePathVo filePathVo = JSON.parseObject(scanAnswerCard.getAdapteUri(), FilePathVo.class);
+                if (filePathVo != null && StringUtils.isNotBlank(filePathVo.getPath())) {
+                    String url = fileStoreUtils.getPrivateUrl(filePathVo.getPath(), filePathVo.getUploadType().getFssType());
+                    try {
+                        String jsonContent = HttpUtil.get(url, null, null, null);
+                        if (StringUtils.isNotBlank(jsonContent)) {
+                            AnswerCard answerCard = JSON.parseObject(jsonContent, AnswerCard.class);
+                            if (answerCard != null && CollectionUtils.isNotEmpty(answerCard.getPages())) {
+                                int pageIndex = 1;
+                                for (AnswerCardPage page : answerCard.getPages()) {
+                                    if (page.getExchange() != null && StringUtils.isNotBlank(page.getExchange().getPageImage())) {
+                                        String pageImage = page.getExchange().getPageImage().replaceAll("\\r\\n", "");
+                                        cardJpgResultList.add(new CardJpgResult("page" + pageIndex, pageIndex, "data:image/png;base64," + pageImage));
+                                    }
+                                }
+                            }
+                        }
+                    } catch (IOException e) {
+                        return cardJpgResultList;
+                    }
+                }
+            }
+        }
+        return cardJpgResultList;
+    }
+
 }

+ 3 - 0
teachcloud-mark/src/main/resources/mapper/MarkStudentMapper.xml

@@ -696,5 +696,8 @@
             parameterType="java.lang.Long">
         select * from basic_teach_clazz where id = #{clazzId}
     </select>
+    <select id="maxCardNumber" resultType="java.lang.Integer">
+        select max(card_number) from mark_student where exam_id = #{examId} and paper_number = #{paperNumber} and paper_type = #{paperType} and card_number is not null
+    </select>
 
 </mapper>