Ver Fonte

3.4.2 update

xiaofei há 8 meses atrás
pai
commit
123dd1808b
35 ficheiros alterados com 342 adições e 229 exclusões
  1. 11 65
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExamTaskDetailCardDto.java
  2. 9 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/initMarkData/ExamDetailCourseInitMarkDto.java
  3. 12 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/ExamDetailCourse.java
  4. 2 2
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/ExamDetailMapper.java
  5. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/ExamStudentMapper.java
  6. 2 2
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamDetailService.java
  7. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamStudentService.java
  8. 1 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamTaskDetailService.java
  9. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/BasicExamStudentServiceImpl.java
  10. 4 4
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamDetailServiceImpl.java
  11. 2 2
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamStudentServiceImpl.java
  12. 10 2
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskDetailServiceImpl.java
  13. 3 2
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskServiceImpl.java
  14. 8 0
      distributed-print-business/src/main/resources/db/log/xf.sql
  15. 6 5
      distributed-print-business/src/main/resources/mapper/ExamDetailMapper.xml
  16. 0 1
      distributed-print-business/src/main/resources/mapper/ExamStudentMapper.xml
  17. 4 10
      distributed-print-business/src/main/resources/mapper/ExamTaskMapper.xml
  18. 9 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/mark/MarkSettingDto.java
  19. 10 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/MarkQuestion.java
  20. 13 1
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkPaper.java
  21. 14 1
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkPaperPackage.java
  22. 12 1
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkStudent.java
  23. 10 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/ScanAnswerCard.java
  24. 2 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkPaperService.java
  25. 1 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkQuestionService.java
  26. 1 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkStudentService.java
  27. 1 1
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/ScanAnswerCardService.java
  28. 23 1
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkPaperServiceImpl.java
  29. 12 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkQuestionServiceImpl.java
  30. 10 1
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkStudentServiceImpl.java
  31. 2 2
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/ScanAnswerCardServiceImpl.java
  32. 3 10
      teachcloud-mark/src/main/resources/mapper/MarkPaperMapper.xml
  33. 32 29
      teachcloud-task/src/main/java/com/qmth/teachcloud/task/job/service/impl/JobServiceImpl.java
  34. 8 7
      teachcloud-task/src/main/java/com/qmth/teachcloud/task/service/PrintFinishService.java
  35. 102 76
      teachcloud-task/src/main/java/com/qmth/teachcloud/task/service/impl/PrintFinishServiceImpl.java

+ 11 - 65
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/ExamTaskDetailCardDto.java

@@ -1,7 +1,9 @@
 package com.qmth.distributed.print.business.bean.dto;
 
+import com.qmth.distributed.print.business.entity.ExamTaskDetail;
 import com.qmth.teachcloud.common.enums.FlowStatusEnum;
 
+import java.util.List;
 import java.util.Objects;
 
 /**
@@ -10,20 +12,12 @@ import java.util.Objects;
 public class ExamTaskDetailCardDto {
 
     private String examTaskId;
-    private String paperType;
-    private String paperAttachmentIds;
-//    private String cardId;
     private String paperConfirmAttachmentIds;
     private String remark;
     private String taskStatus;
     private String cancelRemark;
-    private String exposedPaperType;
-    private String relatePaperType;
-    private String unexposedPaperType;
     private Boolean enable;
-    private String makeMethod;
     private Boolean openAb;
-//    private String status;
     private String flowId;
     private Integer setup;
     // 审核流程taskId
@@ -39,6 +33,7 @@ public class ExamTaskDetailCardDto {
     private String auditContent;
     private Boolean review;
     private String examTaskContent;
+    private List<ExamTaskDetail> examTaskDetailList;
 
     public FlowStatusEnum getFlowStatus() {
         return flowStatus;
@@ -68,30 +63,6 @@ public class ExamTaskDetailCardDto {
         this.examTaskId = examTaskId;
     }
 
-    public String getPaperType() {
-        return paperType;
-    }
-
-    public void setPaperType(String paperType) {
-        this.paperType = paperType;
-    }
-
-    public String getPaperAttachmentIds() {
-        return paperAttachmentIds;
-    }
-
-    public void setPaperAttachmentIds(String paperAttachmentIds) {
-        this.paperAttachmentIds = paperAttachmentIds;
-    }
-
-//    public String getCardId() {
-//        return cardId;
-//    }
-//
-//    public void setCardId(String cardId) {
-//        this.cardId = cardId;
-//    }
-
     public String getPaperConfirmAttachmentIds() {
         return paperConfirmAttachmentIds;
     }
@@ -123,31 +94,6 @@ public class ExamTaskDetailCardDto {
     public void setCancelRemark(String cancelRemark) {
         this.cancelRemark = cancelRemark;
     }
-
-    public String getExposedPaperType() {
-        return exposedPaperType;
-    }
-
-    public void setExposedPaperType(String exposedPaperType) {
-        this.exposedPaperType = exposedPaperType;
-    }
-
-    public String getRelatePaperType() {
-        return relatePaperType;
-    }
-
-    public void setRelatePaperType(String relatePaperType) {
-        this.relatePaperType = relatePaperType;
-    }
-
-    public String getUnexposedPaperType() {
-        return unexposedPaperType;
-    }
-
-    public void setUnexposedPaperType(String unexposedPaperType) {
-        this.unexposedPaperType = unexposedPaperType;
-    }
-
     public Boolean getEnable() {
         return enable;
     }
@@ -156,14 +102,6 @@ public class ExamTaskDetailCardDto {
         this.enable = enable;
     }
 
-    public String getMakeMethod() {
-        return makeMethod;
-    }
-
-    public void setMakeMethod(String makeMethod) {
-        this.makeMethod = makeMethod;
-    }
-
     public Boolean getOpenAb() {
         return openAb;
     }
@@ -274,4 +212,12 @@ public class ExamTaskDetailCardDto {
     public void setExamTaskContent(String examTaskContent) {
         this.examTaskContent = examTaskContent;
     }
+
+    public List<ExamTaskDetail> getExamTaskDetailList() {
+        return examTaskDetailList;
+    }
+
+    public void setExamTaskDetailList(List<ExamTaskDetail> examTaskDetailList) {
+        this.examTaskDetailList = examTaskDetailList;
+    }
 }

+ 9 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/initMarkData/ExamDetailCourseInitMarkDto.java

@@ -11,6 +11,7 @@ public class ExamDetailCourseInitMarkDto {
     private Long courseId;
     private String paperNumber;
     private String coursePaperId;
+    private Integer serialNumber;
     private String paperType;
     private Long createId;
     private String packageCode;
@@ -63,6 +64,14 @@ public class ExamDetailCourseInitMarkDto {
         this.coursePaperId = coursePaperId;
     }
 
+    public Integer getSerialNumber() {
+        return serialNumber;
+    }
+
+    public void setSerialNumber(Integer serialNumber) {
+        this.serialNumber = serialNumber;
+    }
+
     public String getPaperType() {
         return paperType;
     }

+ 12 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/ExamDetailCourse.java

@@ -56,6 +56,10 @@ public class ExamDetailCourse extends BaseEntity implements Serializable {
     @TableField("card_pages_a3")
     private Integer cardPagesA3;
 
+    @ApiModelProperty(value = "备用卷")
+    @TableField("serial_number")
+    private Integer serialNumber;
+
     @ApiModelProperty(value = "当前试卷类型")
     @TableField("paper_type")
     private String paperType;
@@ -197,4 +201,12 @@ public class ExamDetailCourse extends BaseEntity implements Serializable {
     public void setCommonAttachmentId(String commonAttachmentId) {
         this.commonAttachmentId = commonAttachmentId;
     }
+
+    public Integer getSerialNumber() {
+        return serialNumber;
+    }
+
+    public void setSerialNumber(Integer serialNumber) {
+        this.serialNumber = serialNumber;
+    }
 }

+ 2 - 2
distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/ExamDetailMapper.java

@@ -128,7 +128,7 @@ public interface ExamDetailMapper extends BaseMapper<ExamDetail> {
 
     List<ExamDetail> listExamDetailByExamIdAndCourseIdAndPaperNumber(@Param("examId") Long examId, @Param("courseId") Long courseId, @Param("paperNumber") String paperNumber);
 
-    List<ExamDetailCourseInitMarkDto> listPrintFinishPackageCode(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("paperType") String paperType);
+    List<ExamDetailCourseInitMarkDto> listPrintFinishPackageCode(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("serialNumber") Integer serialNumber);
 
-    List<InitExamDetailDto> listPrintFinishExamDetailCourseIds(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("paperType") String paperType);
+    List<InitExamDetailDto> listPrintFinishExamDetailCourseIds(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("serialNumber") Integer serialNumber);
 }

+ 1 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/ExamStudentMapper.java

@@ -27,7 +27,7 @@ public interface ExamStudentMapper extends BaseMapper<ExamStudent> {
 
     List<ExamStudentCourseClassDto> listMarkStudentInfo(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("paperType") String paperType);
 
-    List<ExamStudent> listByExamDetailCourseIdNotIntMarkStudent(@Param("examDetailCourseId") Long examDetailCourseId, @Param("paperType") String paperType);
+    List<ExamStudent> listByExamDetailCourseIdNotIntMarkStudent(@Param("examDetailCourseId") Long examDetailCourseId);
 
     List<ExamStudentInfo> listByExamDetailCourseId(Long examDetailCourseId);
 }

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

@@ -182,9 +182,9 @@ public interface ExamDetailService extends IService<ExamDetail> {
 
     void updateStatusById(Long id, ExamDetailStatusEnum examDetailStatusEnum);
 
-    List<ExamDetailCourseInitMarkDto> listPrintFinishPackageCode(Long examId, String paperNumber, String paperType);
+    List<ExamDetailCourseInitMarkDto> listPrintFinishPackageCode(Long examId, String paperNumber, Integer serialNumber);
 
-    List<InitExamDetailDto> listPrintFinishExamDetailCourseIds(Long examId, String paperNumber, String paperType);
+    List<InitExamDetailDto> listPrintFinishExamDetailCourseIds(Long examId, String paperNumber, Integer serialNumber);
 
     boolean allExamDetailIsExist(Long examId, Long courseId, String paperNumber);
     boolean allExamDetailIsFinish(Long examId, Long courseId, String paperNumber);

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

@@ -27,7 +27,7 @@ public interface ExamStudentService extends IService<ExamStudent> {
 
     void removeByExamDetailCourseId(Long id);
 
-    List<ExamStudent> listByExamDetailCourseIdNotIntMarkStudent(Long examDetailCourseId, String paperType);
+    List<ExamStudent> listByExamDetailCourseIdNotIntMarkStudent(Long examDetailCourseId);
 
     List<ExamStudent> listByExamDetailCourseId(Long examDetailCourseId);
 

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

@@ -59,6 +59,7 @@ public interface ExamTaskDetailService extends IService<ExamTaskDetail> {
     boolean cancel(Long id, String cancelRemark);
 
     ExamTaskDetail getByExamIdAndCourseIdAndPaperNumber(Long examId, Long courseId, String paperNumber);
+    ExamTaskDetail getByExamIdAndPaperNumberAndSerialNumber(Long examId, String paperNumber, Integer serialNumber);
 
     void updateExposePaperType(Long examId, List<ExamDetailCourse> listByExamDetailId);
     void updateUnexposePaperType(Long examId, String paperNumber, String exposePaperType);

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

@@ -453,7 +453,7 @@ public class BasicExamStudentServiceImpl extends ServiceImpl<BasicExamStudentMap
             MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumberAndPaperType(examId, entry.getKey(), null);
             if (markPaper == null && ExamModelEnum.MODEL4.equals(basicExam.getExamModel())) {
                 String paperType = SystemConstant.DEFAULT_PAPER_TYPE_A;
-                markPaper = new MarkPaper(examId, basicExamStudent.getCourseId(), entry.getKey(), String.valueOf(SystemConstant.getDbUuid()), createId, paperType);
+                markPaper = new MarkPaper(examId, basicExamStudent.getCourseId(), entry.getKey(), String.valueOf(SystemConstant.getDbUuid()), createId, 1, paperType);
                 markPaperService.save(markPaper);
             }
             if (markPaper != null) {

+ 4 - 4
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamDetailServiceImpl.java

@@ -1046,13 +1046,13 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
     }
 
     @Override
-    public List<ExamDetailCourseInitMarkDto> listPrintFinishPackageCode(Long examId, String paperNumber, String paperType) {
-        return this.baseMapper.listPrintFinishPackageCode(examId, paperNumber, paperType);
+    public List<ExamDetailCourseInitMarkDto> listPrintFinishPackageCode(Long examId, String paperNumber, Integer serialNumber) {
+        return this.baseMapper.listPrintFinishPackageCode(examId, paperNumber, serialNumber);
     }
 
     @Override
-    public List<InitExamDetailDto> listPrintFinishExamDetailCourseIds(Long examId, String paperNumber, String paperType) {
-        return this.baseMapper.listPrintFinishExamDetailCourseIds(examId, paperNumber, paperType);
+    public List<InitExamDetailDto> listPrintFinishExamDetailCourseIds(Long examId, String paperNumber, Integer serialNumber) {
+        return this.baseMapper.listPrintFinishExamDetailCourseIds(examId, paperNumber, serialNumber);
     }
 
     @Override

+ 2 - 2
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamStudentServiceImpl.java

@@ -86,8 +86,8 @@ public class ExamStudentServiceImpl extends ServiceImpl<ExamStudentMapper, ExamS
     }
 
     @Override
-    public List<ExamStudent> listByExamDetailCourseIdNotIntMarkStudent(Long examDetailCourseId, String paperType) {
-        return this.baseMapper.listByExamDetailCourseIdNotIntMarkStudent(examDetailCourseId, paperType);
+    public List<ExamStudent> listByExamDetailCourseIdNotIntMarkStudent(Long examDetailCourseId) {
+        return this.baseMapper.listByExamDetailCourseIdNotIntMarkStudent(examDetailCourseId);
     }
 
     @Override

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

@@ -671,6 +671,15 @@ public class ExamTaskDetailServiceImpl extends ServiceImpl<ExamTaskDetailMapper,
         return this.getByExamTaskId(examTask.getId());
     }
 
+    @Override
+    public ExamTaskDetail getByExamIdAndPaperNumberAndSerialNumber(Long examId, String paperNumber, Integer serialNumber) {
+        List<ExamTaskDetail> examTaskDetailList = this.listByExamIdAndPaperNumber(examId, paperNumber);
+        if (CollectionUtils.isEmpty(examTaskDetailList)) {
+            return null;
+        }
+        return examTaskDetailList.stream().filter(m -> m.getSerialNumber().equals(serialNumber)).findFirst().orElse(null);
+    }
+
     @Override
     public void updateExposePaperType(Long examId, List<ExamDetailCourse> examDetailCourses) {
         // 更新曝光卷型、未曝光卷型
@@ -731,8 +740,7 @@ public class ExamTaskDetailServiceImpl extends ServiceImpl<ExamTaskDetailMapper,
         if (examTask == null) {
             return Collections.emptyList();
         }
-        this.listByExamTaskId(examTask.getId());
-        return null;
+        return this.listByExamTaskId(examTask.getId());
     }
 
     @Override

+ 3 - 2
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskServiceImpl.java

@@ -852,6 +852,7 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
                 detailCardDto.setReview(basicPrintConfig.getReview());
                 detailCardDto.setAuditContent(basicPrintConfig.getAuditContent());
             }
+            detailCardDto.setExamTaskDetailList(examTaskDetailService.listByExamTaskId(examTaskId));
         }
         return detailCardDto;
     }
@@ -1217,7 +1218,7 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
                     Map<String, Object> map = new HashMap<>();
                     map.computeIfAbsent(SystemConstant.FLOW_TASK_ID, v -> task.getId());
                     map.computeIfAbsent(SystemConstant.APPROVE_OPERATION, v -> FlowApprovePassEnum.PASS);
-                    map.computeIfAbsent(SystemConstant.PAPAER_ATTACHMENT_IDS, v -> examTaskDetailList.stream().map(ExamTaskDetail::getPaperAttachmentIds).collect(Collectors.toList()));
+                    map.computeIfAbsent(SystemConstant.PAPAER_ATTACHMENT_IDS, v -> examTaskDetailList.get(0).getPaperAttachmentIds());
                     map.computeIfAbsent(SystemConstant.APPROVE_USER_IDS, v -> examTaskSubmitPram.getApproveUserIds());
                     activitiService.taskApprove(map);
                     mapVar.putAll(map);
@@ -1267,7 +1268,7 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
                         if (basicStudentIdUserMap.containsKey(i)) {
                             BasicExamStudent basicExamStudent = basicExamStudentService.getById(i);
                             if (basicExamStudent != null) {
-                                throw ExceptionResultEnum.ERROR.exception("教学班[" + basicExamStudent.getTeachClassName() + "]内有考生已被[" + basicStudentIdUserMap.get(i) + "]选择");
+//                                throw ExceptionResultEnum.ERROR.exception("教学班[" + basicExamStudent.getTeachClassName() + "]内有考生已被[" + basicStudentIdUserMap.get(i) + "]选择");
                             }
                         }
                     });

+ 8 - 0
distributed-print-business/src/main/resources/db/log/xf.sql

@@ -26,3 +26,11 @@ ADD COLUMN `remark` VARCHAR(200) NULL AFTER `paper_confirm_attachment_ids`;
 
 update exam_task et set et.paper_confirm_attachment_ids = (select paper_confirm_attachment_ids from exam_task_detail etd where et.id = etd.exam_task_id);
 update exam_task et set et.remark = (select remark from exam_task_detail etd where et.id = etd.exam_task_id);
+
+-- 2024-10-15
+ALTER TABLE `exam_detail_course` ADD COLUMN `serial_number` INT(2) NULL COMMENT '备用卷' AFTER `update_time`;
+ALTER TABLE `mark_paper` ADD COLUMN `serial_number` INT(1) NULL COMMENT '备用卷' AFTER `user_id`;
+ALTER TABLE `mark_paper_package` ADD COLUMN `serial_number` INT(1) NULL COMMENT '备用卷序号' AFTER `course_paper_id`;
+ALTER TABLE `mark_student` ADD COLUMN `serial_number` INT(2) NULL COMMENT '备用卷序号' AFTER `course_paper_id`;
+ALTER TABLE `scan_answer_card` ADD COLUMN `serial_number` INT(2) NULL COMMENT '备用卷序号' AFTER `course_paper_id`;
+ALTER TABLE `mark_question` ADD COLUMN `serial_number` INT(2) NULL COMMENT '备用卷序号' AFTER `paper_number`;

+ 6 - 5
distributed-print-business/src/main/resources/mapper/ExamDetailMapper.xml

@@ -766,13 +766,14 @@
     </select>
     <select id="listPrintFinishExamDetailCourse"
             resultType="com.qmth.distributed.print.business.bean.dto.initMarkData.ExamDetailCourseInitMarkDto">
-        SELECT
+        SELECT distinct
             ed.school_id schoolId,
             be.semester_id semesterId,
             ed.exam_id examId,
             edc.course_id courseId,
             edc.paper_number paperNumber,
             et.id coursePaperId,
+            edc.serial_number serialNumber,
             edc.paper_type paperType,
             et.user_id createId
         FROM
@@ -795,7 +796,7 @@
                           WHERE
                               ed.exam_id = mp.exam_id
                             AND edc.paper_number = mp.paper_number AND mp.student_count > 0)
-        GROUP BY ed.school_id , be.semester_id, ed.exam_id , edc.course_id , edc.paper_number , et.id , edc.paper_type , et.user_id
+        order BY ed.school_id , ed.exam_id , edc.course_id , edc.paper_number
     </select>
     <select id="countMakeupUsedByExamIdAndPaperNumber" resultType="java.lang.Integer">
         SELECT
@@ -847,7 +848,7 @@
         WHERE
             ed.exam_id = #{examId}
           AND edc.paper_number = #{paperNumber}
-          AND edc.paper_type LIKE CONCAT('%', #{paperType}, '%')
+          AND edc.serial_number = #{serialNumber}
           AND NOT EXISTS( SELECT
                               1
                           FROM
@@ -855,7 +856,7 @@
                           WHERE
                               ed.exam_id = mpp.exam_id
                             AND edc.paper_number = mpp.paper_number
-                            AND mpp.paper_type = #{paperType}
+                            AND edc.serial_number = mpp.serial_number
                             AND ed.package_code = mpp.package_code)
 
     </select>
@@ -872,6 +873,6 @@
         WHERE
             ed.exam_id = #{examId}
           AND edc.paper_number = #{paperNumber}
-          AND edc.paper_type LIKE CONCAT('%', #{paperType}, '%')
+          AND edc.serial_number = #{serialNumber}
     </select>
 </mapper>

+ 0 - 1
distributed-print-business/src/main/resources/mapper/ExamStudentMapper.xml

@@ -64,7 +64,6 @@
             exam_student es left join sys_user su on es.teacher_id = su.id
         WHERE
             es.exam_detail_course_id = #{examDetailCourseId}
-          AND es.paper_type = #{paperType}
           AND NOT EXISTS( SELECT
                               1
                           FROM

+ 4 - 10
distributed-print-business/src/main/resources/mapper/ExamTaskMapper.xml

@@ -586,13 +586,9 @@
             g.exam_model examModel,
             g.category,
             h.name semesterName,
-            case #{source} when 'REVIEW' then ifnull(c.paper_type, a.paper_type) else a.paper_type end paperType,
-            case #{source} when 'REVIEW' then ifnull(c.paper_attachment_ids, a.paper_attachment_ids) else a.paper_attachment_ids end paperAttachmentIds,
-            a.paper_confirm_attachment_ids paperConfirmAttachmentIds,
-            a.remark,
-            a.exposed_paper_type exposedPaperType,
-            ifnull(d.make_method, a.make_method) makeMethod,
-            a.open_ab openAb,
+            e.paper_confirm_attachment_ids paperConfirmAttachmentIds,
+            e.remark,
+            e.open_ab openAb,
             e.flow_id flowId,
             f.setup,
             f.status as flowStatus,
@@ -600,9 +596,7 @@
         FROM
             exam_task e
                 left JOIN
-            exam_task_detail a on a.exam_task_id = e.id
-                left JOIN
-            exam_task_paper_log c ON a.exam_task_id = c.exam_task_id and c.review = false
+            exam_task_paper_log c ON e.id = c.exam_task_id and c.review = false
                 left join
             exam_card d on c.card_id = d.id
                 left join

+ 9 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/mark/MarkSettingDto.java

@@ -21,6 +21,7 @@ public class MarkSettingDto {
     private Boolean groupStatus;
     private MarkMode markMode;
     private String markModeDisplay;
+    private Integer serialNumber;
     private String paperType;
     @JsonSerialize(using = ToStringSerializer.class)
     private Long cardId;
@@ -105,6 +106,14 @@ public class MarkSettingDto {
         this.markModeDisplay = markModeDisplay;
     }
 
+    public Integer getSerialNumber() {
+        return serialNumber;
+    }
+
+    public void setSerialNumber(Integer serialNumber) {
+        this.serialNumber = serialNumber;
+    }
+
     public String getPaperType() {
         return paperType;
     }

+ 10 - 1
teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/MarkQuestion.java

@@ -35,7 +35,8 @@ public class MarkQuestion extends BaseEntity implements Serializable {
 
     @ApiModelProperty(value = "试卷类型")
     private String paperNumber;
-
+    @ApiModelProperty(value = "备用卷序号")
+    private Integer serialNumber;
     @ApiModelProperty(value = "试卷卷型")
     private String paperType;
 
@@ -100,6 +101,14 @@ public class MarkQuestion extends BaseEntity implements Serializable {
         this.paperNumber = paperNumber;
     }
 
+    public Integer getSerialNumber() {
+        return serialNumber;
+    }
+
+    public void setSerialNumber(Integer serialNumber) {
+        this.serialNumber = serialNumber;
+    }
+
     public String getPaperType() {
         return paperType;
     }

+ 13 - 1
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkPaper.java

@@ -127,19 +127,23 @@ public class MarkPaper implements Serializable {
     @ApiModelProperty(value = "命题老师ID")
     private Long userId;
 
+    @ApiModelProperty(value = "备用卷")
+    private Integer serialNumber;
+
     @ApiModelProperty(value = "试卷类型")
     private String paperType;
 
     public MarkPaper() {
     }
 
-    public MarkPaper(Long examId, Long courseId, String paperNumber, String coursePaperId, Long userId, String paperType) {
+    public MarkPaper(Long examId, Long courseId, String paperNumber, String coursePaperId, Long userId, Integer serialNumber, String paperType) {
         this.id = SystemConstant.getDbUuid();
         this.examId = examId;
         this.courseId = courseId;
         this.paperNumber = paperNumber;
         this.coursePaperId = coursePaperId;
         this.userId = userId;
+        this.serialNumber = serialNumber;
         this.paperType = paperType;
         this.markMode = MarkMode.TRACK;
         this.objectiveScore = 0D;
@@ -433,6 +437,14 @@ public class MarkPaper implements Serializable {
         this.userId = userId;
     }
 
+    public Integer getSerialNumber() {
+        return serialNumber;
+    }
+
+    public void setSerialNumber(Integer serialNumber) {
+        this.serialNumber = serialNumber;
+    }
+
     public String getPaperType() {
         return paperType;
     }

+ 14 - 1
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkPaperPackage.java

@@ -44,6 +44,10 @@ public class MarkPaperPackage implements Serializable {
     @MppMultiId(value = "course_paper_id")
     private String coursePaperId;
 
+    @ApiModelProperty(value = "备用卷序号")
+    @MppMultiId(value = "serial_number")
+    private Integer serialNumber;
+
     @ApiModelProperty(value = "试卷类型")
     @MppMultiId(value = "paper_type")
     private String paperType;
@@ -55,11 +59,12 @@ public class MarkPaperPackage implements Serializable {
     public MarkPaperPackage() {
     }
 
-    public MarkPaperPackage(Long examId, Long courseId, String paperNumber, String coursePaperId, String paperType, String packageCode) {
+    public MarkPaperPackage(Long examId, Long courseId, String paperNumber, String coursePaperId, Integer serialNumber, String paperType, String packageCode) {
         this.examId = examId;
         this.courseId = courseId;
         this.paperNumber = paperNumber;
         this.coursePaperId = coursePaperId;
+        this.serialNumber = serialNumber;
         this.paperType = paperType;
         this.packageCode = packageCode;
     }
@@ -112,6 +117,14 @@ public class MarkPaperPackage implements Serializable {
         this.coursePaperId = coursePaperId;
     }
 
+    public Integer getSerialNumber() {
+        return serialNumber;
+    }
+
+    public void setSerialNumber(Integer serialNumber) {
+        this.serialNumber = serialNumber;
+    }
+
     public String getPaperType() {
         return paperType;
     }

+ 12 - 1
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkStudent.java

@@ -72,6 +72,8 @@ public class MarkStudent implements Serializable {
     @ApiModelProperty(value = "试卷编号")
     private String paperNumber;
 
+    @ApiModelProperty(value = "备用卷")
+    private Integer serialNumber;
     @ApiModelProperty(value = "试卷类型")
     private String paperType;
 
@@ -200,7 +202,7 @@ public class MarkStudent implements Serializable {
     }
 
     public MarkStudent(Long id, Long examId, Long basicStudentId, Long courseId,
-                       String paperNumber, String coursePaperId, String paperType,
+                       String paperNumber, String coursePaperId, Integer serialNumber, String paperType,
                        String studentCode, String packageCode, String examPlace,
                        String examRoom, Long examStartTime, Long examEndTime, Long createId) {
         this.id = id;
@@ -209,6 +211,7 @@ public class MarkStudent implements Serializable {
         this.courseId = courseId;
         this.paperNumber = paperNumber;
         this.coursePaperId = coursePaperId;
+        this.serialNumber = serialNumber;
         this.paperType = paperType;
         this.studentCode = studentCode;
         this.packageCode = packageCode;
@@ -272,6 +275,14 @@ public class MarkStudent implements Serializable {
         this.paperNumber = paperNumber;
     }
 
+    public Integer getSerialNumber() {
+        return serialNumber;
+    }
+
+    public void setSerialNumber(Integer serialNumber) {
+        this.serialNumber = serialNumber;
+    }
+
     public String getPaperType() {
         return paperType;
     }

+ 10 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/ScanAnswerCard.java

@@ -39,6 +39,8 @@ public class ScanAnswerCard implements Serializable {
 
     @ApiModelProperty(value = "试卷编号(交互)")
     private String coursePaperId;
+    @ApiModelProperty(value = "备用卷序号")
+    private Integer serialNumber;
     @ApiModelProperty(value = "试卷类型")
     private String paperType;
 
@@ -110,6 +112,14 @@ public class ScanAnswerCard implements Serializable {
         this.paperNumber = paperNumber;
     }
 
+    public Integer getSerialNumber() {
+        return serialNumber;
+    }
+
+    public void setSerialNumber(Integer serialNumber) {
+        this.serialNumber = serialNumber;
+    }
+
     public String getPaperType() {
         return paperType;
     }

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

@@ -36,6 +36,7 @@ public interface MarkPaperService extends IService<MarkPaper> {
     MarkPaper getByExamIdAndPaperNumber(Long examId, String paperNumber);
 
     MarkPaper getByExamIdAndPaperNumberAndPaperType(Long examId, String paperNumber, String paperType);
+    MarkPaper getByExamIdAndPaperNumberAndSerialNumber(Long examId, String paperNumber, Integer serialNumber);
 
     void savePaperSetting(MarkPaper markPaper);
 
@@ -78,6 +79,7 @@ public interface MarkPaperService extends IService<MarkPaper> {
     int countByPropositionTeacherId(boolean status);
 
     void updateStudentCountByExamIdAndPaperNumberAndPaperType(Long examId, String paperNumber, String paperType);
+    void updateStudentCountByExamIdAndPaperNumberAndSerialNumber(Long examId, String paperNumber, Integer serialNumber);
 
     SettingDto getSetting(Long examId, String paperNumber);
 

+ 1 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkQuestionService.java

@@ -35,6 +35,7 @@ public interface MarkQuestionService extends IService<MarkQuestion> {
     String assembleGroupQuestionsByExamIdAndPaperNumberAndNumber(Long examId, String paperNumber, Integer groupNumber);
 
     List<MarkQuestion> listQuestionByExamIdAndPaperNumberAndPaperType(Long examId, String paperNumber, String paperType);
+    List<MarkQuestion> listQuestionByExamIdAndPaperNumberAndSerialNumber(Long examId, String paperNumber, Integer serialNumber);
 
     void saveQuestions(MarkQuestionParams markQuestionParams);
 

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

@@ -144,6 +144,7 @@ public interface MarkStudentService extends IService<MarkStudent> {
     UpdateTimeVo omrEdit(Long userId, OmrEditDomain domain);
 
     long countByExamIdAndPaperNumber(Long examId, String paperNumber, String paperType);
+    long countByExamIdAndPaperNumberAndSerialNumber(Long examId, String paperNumber, Integer serialNumber);
 
     AbsentManualUpdateVo absentManualUpdate(Long examId, String coursePaperId, String studentCode, ScanStatus status);
 

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

@@ -38,7 +38,7 @@ public interface ScanAnswerCardService extends IService<ScanAnswerCard> {
 
     AnswerCardVo cardGet(Long examId, Integer number);
 
-    ScanAnswerCard getByExamIdAndCoursePaperIdAndPaperTypeAndCardId(Long examId, String coursePaperId, String paperType, Long cardId);
+    ScanAnswerCard getByExamIdAndCoursePaperIdAndSerialNumberAndCardId(Long examId, String coursePaperId, Integer serialNumber, Long cardId);
 
     List<ScanAnswerCard> listByExamIdAndPaperNumber(Long examId, String paperNumber);
 

+ 23 - 1
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkPaperServiceImpl.java

@@ -151,6 +151,16 @@ public class MarkPaperServiceImpl extends ServiceImpl<MarkPaperMapper, MarkPaper
         return this.getOne(queryWrapper);
     }
 
+    @Override
+    public MarkPaper getByExamIdAndPaperNumberAndSerialNumber(Long examId, String paperNumber, Integer serialNumber) {
+        QueryWrapper<MarkPaper> queryWrapper = new QueryWrapper<>();
+        LambdaQueryWrapper<MarkPaper> lambda = queryWrapper.lambda();
+        lambda.eq(MarkPaper::getExamId, examId)
+                .eq(MarkPaper::getPaperNumber, paperNumber)
+                .eq(MarkPaper::getSerialNumber, serialNumber);
+        return this.getOne(queryWrapper);
+    }
+
     @Transactional
     @Override
     public void savePaperSetting(MarkPaper markPaper) {
@@ -452,6 +462,18 @@ public class MarkPaperServiceImpl extends ServiceImpl<MarkPaperMapper, MarkPaper
         this.update(updateWrapper);
     }
 
+    @Override
+    public void updateStudentCountByExamIdAndPaperNumberAndSerialNumber(Long examId, String paperNumber, Integer serialNumber) {
+        long count = markStudentService.countByExamIdAndPaperNumberAndSerialNumber(examId, paperNumber, serialNumber);
+        UpdateWrapper<MarkPaper> updateWrapper = new UpdateWrapper<>();
+        LambdaUpdateWrapper<MarkPaper> lambda = updateWrapper.lambda();
+        lambda.set(MarkPaper::getStudentCount, count)
+                .eq(MarkPaper::getExamId, examId)
+                .eq(MarkPaper::getPaperNumber, paperNumber)
+                .eq(MarkPaper::getSerialNumber, serialNumber);
+        this.update(updateWrapper);
+    }
+
     @Override
     public SettingDto getSetting(Long examId, String paperNumber) {
         SettingDto settingDto = new SettingDto();
@@ -602,7 +624,7 @@ public class MarkPaperServiceImpl extends ServiceImpl<MarkPaperMapper, MarkPaper
                 }
                 MarkPaper markPaper = markPaperList.get(0);
                 // 结束阅卷,跳过导入
-                if(MarkPaperStatus.FINISH.equals(markPaper.getStatus())){
+                if (MarkPaperStatus.FINISH.equals(markPaper.getStatus())) {
                     continue;
                 }
 

+ 12 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkQuestionServiceImpl.java

@@ -80,6 +80,18 @@ public class MarkQuestionServiceImpl extends ServiceImpl<MarkQuestionMapper, Mar
         return this.list(queryWrapper);
     }
 
+    @Override
+    public List<MarkQuestion> listQuestionByExamIdAndPaperNumberAndSerialNumber(Long examId, String paperNumber, Integer serialNumber) {
+        QueryWrapper<MarkQuestion> queryWrapper = new QueryWrapper<>();
+        LambdaQueryWrapper<MarkQuestion> lambdaQueryWrapper = queryWrapper.lambda();
+        lambdaQueryWrapper.eq(MarkQuestion::getExamId, examId)
+                .eq(MarkQuestion::getPaperNumber, paperNumber)
+            .eq(MarkQuestion::getSerialNumber, serialNumber);
+        lambdaQueryWrapper.orderByAsc(MarkQuestion::getMainNumber)
+                .orderByAsc(MarkQuestion::getSubNumber);
+        return this.list(queryWrapper);
+    }
+
     @Transactional
     @Override
     public void saveQuestions(MarkQuestionParams markQuestionParams) {

+ 10 - 1
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkStudentServiceImpl.java

@@ -1066,6 +1066,15 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
         return this.count(queryWrapper);
     }
 
+    @Override
+    public long countByExamIdAndPaperNumberAndSerialNumber(Long examId, String paperNumber, Integer serialNumber) {
+        QueryWrapper<MarkStudent> queryWrapper = new QueryWrapper<>();
+        LambdaQueryWrapper<MarkStudent> lambda = queryWrapper.lambda();
+        lambda.eq(MarkStudent::getExamId, examId).eq(MarkStudent::getPaperNumber, paperNumber)
+                .eq(MarkStudent::getSerialNumber, serialNumber);
+        return this.count(queryWrapper);
+    }
+
     @Transactional
     @Override
     public AbsentManualUpdateVo absentManualUpdate(Long examId, String coursePaperId, String studentCode,
@@ -1977,7 +1986,7 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
             if (MarkPaperStatus.FINISH.equals(markPaper.getStatus())) {
                 throw ExceptionResultEnum.ERROR.exception("试卷编号[" + markPaper.getPaperNumber() + "]已结束阅卷,不允许新增考生");
             }
-            markStudent = new MarkStudent(SystemConstant.getDbUuid(), basicExamStudent.getExamId(), basicExamStudent.getId(), basicExamStudent.getCourseId(), basicExamStudent.getPaperNumber(), markPaper.getCoursePaperId(), markPaper.getPaperType(), basicExamStudent.getStudentCode(), "", basicExamStudent.getExamPlace(), basicExamStudent.getExamRoom(), basicExamStudent.getExamStartTime(), basicExamStudent.getExamEndTime(), markPaper.getUserId());
+            markStudent = new MarkStudent(SystemConstant.getDbUuid(), basicExamStudent.getExamId(), basicExamStudent.getId(), basicExamStudent.getCourseId(), basicExamStudent.getPaperNumber(), markPaper.getCoursePaperId(),markPaper.getSerialNumber(), markPaper.getPaperType(), basicExamStudent.getStudentCode(), "", basicExamStudent.getExamPlace(), basicExamStudent.getExamRoom(), basicExamStudent.getExamStartTime(), basicExamStudent.getExamEndTime(), markPaper.getUserId());
             if (markStudent.getSecretNumber() == null) {
                 markStudent.randomSecretNumber();
                 while (secretNumberSet.contains(markStudent.getSecretNumber())

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

@@ -257,11 +257,11 @@ public class ScanAnswerCardServiceImpl extends ServiceImpl<ScanAnswerCardMapper,
     }
 
     @Override
-    public ScanAnswerCard getByExamIdAndCoursePaperIdAndPaperTypeAndCardId(Long examId, String coursePaperId, String paperType, Long cardId) {
+    public ScanAnswerCard getByExamIdAndCoursePaperIdAndSerialNumberAndCardId(Long examId, String coursePaperId, Integer serialNumber, Long cardId) {
         QueryWrapper<ScanAnswerCard> queryWrapper = new QueryWrapper<>();
         queryWrapper.lambda().eq(ScanAnswerCard::getExamId, examId)
                 .eq(ScanAnswerCard::getCoursePaperId, coursePaperId)
-                .eq(ScanAnswerCard::getPaperType, paperType)
+                .eq(ScanAnswerCard::getSerialNumber, serialNumber)
                 .eq(ScanAnswerCard::getCardId, cardId);
         return this.getOne(queryWrapper);
     }

+ 3 - 10
teachcloud-mark/src/main/resources/mapper/MarkPaperMapper.xml

@@ -39,7 +39,8 @@
         mp.mark_mode markMode,
         mp.question_status questionStatus,
         mp.group_status groupStatus,
-        group_concat(mp.paper_type) paperType
+        mp.serial_number serialNumber,
+        mp.paper_type paperType
         FROM
         mark_paper mp
             LEFT JOIN
@@ -87,15 +88,7 @@
                 </if>
             </if>
         </where>
-        group by mp.course_id ,
-            mp.exam_id ,
-            bc.code ,
-            bc.name ,
-            so.name ,
-            mp.paper_number ,
-            mp.mark_mode ,
-            mp.question_status ,
-            mp.group_status
+        order by mp.id desc
     </select>
     <select id="listQualityMarkPaperByStatus" resultType="com.qmth.teachcloud.mark.entity.MarkPaper">
         SELECT exam_id      examId,

+ 32 - 29
teachcloud-task/src/main/java/com/qmth/teachcloud/task/job/service/impl/JobServiceImpl.java

@@ -3,9 +3,7 @@ package com.qmth.teachcloud.task.job.service.impl;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.qmth.boot.redis.uid.RedisMachineService;
 import com.qmth.distributed.print.business.bean.dto.initMarkData.ExamDetailCourseInitMarkDto;
-import com.qmth.distributed.print.business.entity.ExamTaskDetail;
-import com.qmth.distributed.print.business.entity.TBSyncTask;
-import com.qmth.distributed.print.business.entity.TBTaskPdf;
+import com.qmth.distributed.print.business.entity.*;
 import com.qmth.distributed.print.business.enums.ExamDetailStatusEnum;
 import com.qmth.distributed.print.business.service.*;
 import com.qmth.distributed.print.business.templete.execute.AsyncCreatePdfTemplateService;
@@ -13,6 +11,7 @@ import com.qmth.teachcloud.common.bean.dto.MqDto;
 import com.qmth.teachcloud.common.bean.vo.PaperInfoVo;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.BasicCourse;
+import com.qmth.teachcloud.common.entity.BasicExam;
 import com.qmth.teachcloud.common.entity.TSAuth;
 import com.qmth.teachcloud.common.enums.AuthEnum;
 import com.qmth.teachcloud.common.enums.PushTypeEnum;
@@ -99,6 +98,10 @@ public class JobServiceImpl implements JobService {
 
     @Resource
     TSAuthService tsAuthService;
+    @Resource
+    private ExamTaskService examTaskService;
+    @Resource
+    private BasicCardRuleService basicCardRuleService;
 
     @Override
     public void sendSmsExpireTask() {
@@ -170,36 +173,36 @@ public class JobServiceImpl implements JobService {
         long startTime = DateDisposeUtils.parseDate("2024-04-22 00:00:00").getTime();
         List<ExamDetailCourseInitMarkDto> examDetailCourseInitMarkDtoList = examDetailService.listPrintFinishExamDetailCourse(ExamDetailStatusEnum.FINISH.name(), startTime);
         for (ExamDetailCourseInitMarkDto dto : examDetailCourseInitMarkDtoList) {
-            for (String paperType : dto.getPaperType().split(",")) {
+            try {
+                lockService.waitlock(LockType.INIT_MARK_DATA, dto.getExamId(), dto.getPaperNumber(), dto.getSerialNumber());
+                BasicCourse basicCourse = basicCourseService.getById(dto.getCourseId());
+                ExamTask examTask = examTaskService.getByExamIdAndPaperNumber(dto.getExamId(), dto.getPaperNumber());
+                BasicCardRule basicCardRule = basicCardRuleService.getById(examTask.getCardRuleId());
+                if (basicCourse == null) {
+                    continue;
+                }
+                TBSyncTask tbSyncTask = tbSyncTaskService.saveTask(dto.getSchoolId(), dto.getSemesterId(), dto.getExamId(), dto.getCourseId(), dto.getPaperNumber(), dto.getPaperType(), PushTypeEnum.INIT_MARK_DATA, "");
                 try {
-                    lockService.waitlock(LockType.INIT_MARK_DATA, dto.getExamId(), dto.getPaperNumber(), paperType);
-                    BasicCourse basicCourse = basicCourseService.getById(dto.getCourseId());
-                    if (basicCourse == null) {
-                        continue;
-                    }
-                    TBSyncTask tbSyncTask = tbSyncTaskService.saveTask(dto.getSchoolId(), dto.getSemesterId(), dto.getExamId(), dto.getCourseId(), dto.getPaperNumber(), paperType, PushTypeEnum.INIT_MARK_DATA, "");
-                    try {
-                        ExamTaskDetail examTaskDetail = examTaskDetailService.getByExamIdAndCourseIdAndPaperNumber(dto.getExamId(), dto.getCourseId(), dto.getPaperNumber());
-                        List<PaperInfoVo> paperInfoVos = ExamTaskUtil.parsePaperAttachmentPath(examTaskDetail.getPaperAttachmentIds(), paperType);
-                        printFinishService.insertMarkPaper(dto.getExamId(), dto.getCourseId(), dto.getPaperNumber(), dto.getCoursePaperId(), dto.getCreateId(), paperType, paperInfoVos);
-                        printFinishService.insertMarkPaperPackageCode(dto, paperType);
-                        printFinishService.insertMarkStudent(dto, paperType);
-                        printFinishService.insertScanAnswerCardAndMarkQuestion(dto, paperType);
-                        tbSyncTask.setResult(TaskResultEnum.SUCCESS);
-                    } catch (Exception e) {
-                        tbSyncTask.setResult(TaskResultEnum.ERROR);
-                        tbSyncTask.setSummary(e.getMessage());
-                        log.info("结束同步失败:" + DateDisposeUtils.dateTimeNow(DateDisposeUtils.YYYY_MM_DD_HH_MM_SS));
-                    } finally {
-                        tbSyncTask.setStatus(TaskStatusEnum.FINISH);
-                        tbSyncTaskService.updateById(tbSyncTask);
-                        log.info("结束同步数据:" + DateDisposeUtils.dateTimeNow(DateDisposeUtils.YYYY_MM_DD_HH_MM_SS));
-                    }
+                    ExamTaskDetail examTaskDetail = examTaskDetailService.getByExamIdAndPaperNumberAndSerialNumber(dto.getExamId(), dto.getPaperNumber(), dto.getSerialNumber());
+                    List<PaperInfoVo> paperInfoVos = ExamTaskUtil.parsePaperAttachmentPath(examTaskDetail.getPaperAttachmentIds(), examTaskDetail.getPaperType());
+                    printFinishService.insertMarkPaper(dto, paperInfoVos);
+                    printFinishService.insertMarkPaperPackageCode(dto);
+                    printFinishService.insertMarkStudent(dto, basicCardRule);
+                    printFinishService.insertScanAnswerCardAndMarkQuestion(dto);
+                    tbSyncTask.setResult(TaskResultEnum.SUCCESS);
                 } catch (Exception e) {
-                    log.error("init mark data error", e);
+                    tbSyncTask.setResult(TaskResultEnum.ERROR);
+                    tbSyncTask.setSummary(e.getMessage());
+                    log.info("结束同步失败:" + DateDisposeUtils.dateTimeNow(DateDisposeUtils.YYYY_MM_DD_HH_MM_SS));
                 } finally {
-                    lockService.unlock(LockType.INIT_MARK_DATA, dto.getExamId(), dto.getPaperNumber(), paperType);
+                    tbSyncTask.setStatus(TaskStatusEnum.FINISH);
+                    tbSyncTaskService.updateById(tbSyncTask);
+                    log.info("结束同步数据:" + DateDisposeUtils.dateTimeNow(DateDisposeUtils.YYYY_MM_DD_HH_MM_SS));
                 }
+            } catch (Exception e) {
+                log.error("init mark data error", e);
+            } finally {
+                lockService.unlock(LockType.INIT_MARK_DATA, dto.getExamId(), dto.getPaperNumber(), dto.getSerialNumber());
             }
         }
     }

+ 8 - 7
teachcloud-task/src/main/java/com/qmth/teachcloud/task/service/PrintFinishService.java

@@ -1,6 +1,7 @@
 package com.qmth.teachcloud.task.service;
 
 import com.qmth.distributed.print.business.bean.dto.initMarkData.ExamDetailCourseInitMarkDto;
+import com.qmth.distributed.print.business.entity.BasicCardRule;
 import com.qmth.teachcloud.common.bean.vo.PaperInfoVo;
 
 import java.util.List;
@@ -10,19 +11,19 @@ import java.util.List;
  */
 public interface PrintFinishService {
 
-    void insertMarkPaper(Long examId, Long courseId, String paperNumber, String coursePaperId, Long userId, String paperType, List<PaperInfoVo> paperInfoVos);
+    void insertMarkPaper(ExamDetailCourseInitMarkDto dto, List<PaperInfoVo> paperInfoVos);
 
-    void insertMarkStudent(ExamDetailCourseInitMarkDto examDetail, String paperType);
+    void insertMarkStudent(ExamDetailCourseInitMarkDto examDetail, BasicCardRule basicCardRule);
 
-    void insertScanAnswerCardAndMarkQuestion(ExamDetailCourseInitMarkDto dto, String paperType);
+    void insertScanAnswerCardAndMarkQuestion(ExamDetailCourseInitMarkDto dto);
 
-    void insertScanAnswerCard(ExamDetailCourseInitMarkDto dto, String paperType, PaperInfoVo paperInfoVo, String content);
+    void insertScanAnswerCard(ExamDetailCourseInitMarkDto dto, String cardId, String content);
 
-    void insertMarkQuestion(Long examId, String paperNumber, String paperType, String content);
+    void insertMarkQuestion(Long examId, String paperNumber, Integer serialNumber, String paperType, String content);
 
-    void insertPaperAnswerFile(Long examId, String paperNumber, String paperType, Long paperId);
+    void insertPaperAnswerFile(Long examId, String paperNumber, Integer serialNumber, Long paperId);
 
-    void insertMarkPaperPackageCode(ExamDetailCourseInitMarkDto dto, String paperType);
+    void insertMarkPaperPackageCode(ExamDetailCourseInitMarkDto dto);
 
     void updateMarkSheetConfig(ExamDetailCourseInitMarkDto dto, String content);
 }

+ 102 - 76
teachcloud-task/src/main/java/com/qmth/teachcloud/task/service/impl/PrintFinishServiceImpl.java

@@ -7,6 +7,7 @@ import com.qmth.distributed.print.business.bean.dto.initMarkData.ExamDetailCours
 import com.qmth.distributed.print.business.bean.dto.initMarkData.InitExamDetailDto;
 import com.qmth.distributed.print.business.entity.*;
 import com.qmth.distributed.print.business.enums.CardTypeEnum;
+import com.qmth.distributed.print.business.enums.ExamNumberStyleEnum;
 import com.qmth.distributed.print.business.service.*;
 import com.qmth.teachcloud.common.bean.vo.PaperInfoVo;
 import com.qmth.teachcloud.common.contant.SystemConstant;
@@ -47,6 +48,8 @@ import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
 
 @Service
 public class PrintFinishServiceImpl implements PrintFinishService {
@@ -85,11 +88,11 @@ public class PrintFinishServiceImpl implements PrintFinishService {
      */
     @Transactional
     @Override
-    public void insertMarkPaper(Long examId, Long courseId, String paperNumber, String coursePaperId, Long userId, String paperType, List<PaperInfoVo> paperInfoVos) {
+    public void insertMarkPaper(ExamDetailCourseInitMarkDto dto, List<PaperInfoVo> paperInfoVos) {
         try {
-            MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumberAndPaperType(examId, paperNumber, paperType);
+            MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumberAndSerialNumber(dto.getExamId(), dto.getPaperNumber(), dto.getSerialNumber());
             if (markPaper == null) {
-                MarkPaper insertMarkPaper = new MarkPaper(examId, courseId, paperNumber, coursePaperId, userId, paperType);
+                MarkPaper insertMarkPaper = new MarkPaper(dto.getExamId(), dto.getCourseId(), dto.getPaperNumber(), dto.getCoursePaperId(), dto.getCreateId(), dto.getSerialNumber(), dto.getPaperType());
                 if (CollectionUtils.isNotEmpty(paperInfoVos)) {
                     BasicAttachment basicAttachment = basicAttachmentService.getById(paperInfoVos.get(0).getAttachmentId());
                     if (basicAttachment != null) {
@@ -105,20 +108,20 @@ public class PrintFinishServiceImpl implements PrintFinishService {
 
     @Transactional
     @Override
-    public void insertMarkStudent(ExamDetailCourseInitMarkDto dto, String paperType) {
+    public void insertMarkStudent(ExamDetailCourseInitMarkDto dto, BasicCardRule basicCardRule) {
         try {
-            List<InitExamDetailDto> initExamDetailDtoList = examDetailService.listPrintFinishExamDetailCourseIds(dto.getExamId(), dto.getPaperNumber(), paperType);
+            List<InitExamDetailDto> initExamDetailDtoList = examDetailService.listPrintFinishExamDetailCourseIds(dto.getExamId(), dto.getPaperNumber(), dto.getSerialNumber());
 
             List<MarkStudent> markStudentList = new ArrayList<>();
             Set<String> secretNumberSet = new HashSet<>();
             for (InitExamDetailDto initExamDetailDto : initExamDetailDtoList) {
-                List<ExamStudent> examStudentList = examStudentService.listByExamDetailCourseIdNotIntMarkStudent(initExamDetailDto.getExamDetailCourseId(), paperType);
+                List<ExamStudent> examStudentList = examStudentService.listByExamDetailCourseIdNotIntMarkStudent(initExamDetailDto.getExamDetailCourseId());
                 for (ExamStudent examStudent : examStudentList) {
                     MarkStudent markStudent = markStudentService.getById(examStudent.getId());
                     if (markStudent != null) {
                         continue;
                     }
-                    MarkStudent student = new MarkStudent(examStudent.getId(), dto.getExamId(), examStudent.getBasicStudentId(), dto.getCourseId(), dto.getPaperNumber(), dto.getCoursePaperId(), paperType, examStudent.getStudentCode(), initExamDetailDto.getPackageCode(), initExamDetailDto.getExamPlace(), initExamDetailDto.getExamRoom(), initExamDetailDto.getExamStartTime(), initExamDetailDto.getExamEndTime(), dto.getCreateId());
+                    MarkStudent student = new MarkStudent(examStudent.getId(), dto.getExamId(), examStudent.getBasicStudentId(), dto.getCourseId(), dto.getPaperNumber(), dto.getCoursePaperId(), dto.getSerialNumber(), basicCardRule.getExamNumberStyle().equals(ExamNumberStyleEnum.PRINT) ? examStudent.getPaperType() : null, examStudent.getStudentCode(), initExamDetailDto.getPackageCode(), initExamDetailDto.getExamPlace(), initExamDetailDto.getExamRoom(), initExamDetailDto.getExamStartTime(), initExamDetailDto.getExamEndTime(), dto.getCreateId());
                     if (student.getSecretNumber() == null) {
                         student.randomSecretNumber();
                         while (secretNumberSet.contains(student.getSecretNumber())
@@ -134,7 +137,7 @@ public class PrintFinishServiceImpl implements PrintFinishService {
             if (CollectionUtils.isNotEmpty(markStudentList)) {
                 markStudentService.saveBatch(markStudentList);
                 // 更新mark_paper表student_count字段
-                markPaperService.updateStudentCountByExamIdAndPaperNumberAndPaperType(dto.getExamId(), dto.getPaperNumber(), paperType);
+                markPaperService.updateStudentCountByExamIdAndPaperNumberAndSerialNumber(dto.getExamId(), dto.getPaperNumber(), dto.getSerialNumber());
             }
         } catch (Exception e) {
             log.info("考生同步阅卷失败", e.getMessage());
@@ -143,43 +146,42 @@ public class PrintFinishServiceImpl implements PrintFinishService {
     }
 
     @Override
-    public void insertScanAnswerCardAndMarkQuestion(ExamDetailCourseInitMarkDto dto, String paperType) {
-        if (StringUtils.isNotBlank(paperType)) {
-            ExamTaskDetail examTaskDetail = examTaskDetailService.getByExamIdAndCourseIdAndPaperNumber(dto.getExamId(), dto.getCourseId(), dto.getPaperNumber());
-            List<PaperInfoVo> paperInfoVoList = ExamTaskUtil.parsePaperAttachmentPath(examTaskDetail.getPaperAttachmentIds(), paperType);
-            for (PaperInfoVo paperInfoVo : paperInfoVoList) {
-                ExamCard examCard = examCardService.getById(paperInfoVo.getCardId());
-                if (examCard != null) {
-                    // 上传通卡,不同步卡格式
-                    if (CardTypeEnum.GENERIC.equals(examCard.getType()) && CardCreateMethodEnum.UPLOAD.equals(examCard.getCreateMethod())) {
-                        continue;
-                    }
-                    // 解析卡格式中试卷结构并保存
-                    this.insertMarkQuestion(dto.getExamId(), dto.getPaperNumber(), paperType, examCard.getContent());
-                    // 生成并保存卡格式文件(后缀为.json)
-                    this.insertScanAnswerCard(dto, paperType, paperInfoVo, examCard.getContent());
-                    // 题库获取的试卷,同步标答文件
-                    if (examCard.getPaperId() != null) {
-                        this.insertPaperAnswerFile(dto.getExamId(), dto.getPaperNumber(), paperType, examCard.getPaperId());
-                    }
-                    this.updateMarkSheetConfig(dto, examCard.getContent());
+    public void insertScanAnswerCardAndMarkQuestion(ExamDetailCourseInitMarkDto dto) {
+        ExamTaskDetail examTaskDetail = examTaskDetailService.getByExamIdAndCourseIdAndPaperNumber(dto.getExamId(), dto.getCourseId(), dto.getPaperNumber());
+        List<PaperInfoVo> paperInfoVoList = ExamTaskUtil.parsePaperAttachmentPath(examTaskDetail.getPaperAttachmentIds());
+        List<String> cardIds = paperInfoVoList.stream().map(PaperInfoVo::getCardId).distinct().collect(Collectors.toList());
+        for (String cardId : cardIds) {
+            ExamCard examCard = examCardService.getById(cardId);
+            if (examCard != null) {
+                // 上传通卡,不同步卡格式
+                if (CardTypeEnum.GENERIC.equals(examCard.getType()) && CardCreateMethodEnum.UPLOAD.equals(examCard.getCreateMethod())) {
+                    continue;
+                }
+                // 解析卡格式中试卷结构并保存
+                this.insertMarkQuestion(dto.getExamId(), dto.getPaperNumber(), dto.getSerialNumber(), dto.getPaperType(), examCard.getContent());
+                // 生成并保存卡格式文件(后缀为.json)
+                this.insertScanAnswerCard(dto, cardId, examCard.getContent());
+                // 题库获取的试卷,同步标答文件
+                if (examCard.getPaperId() != null) {
+                    this.insertPaperAnswerFile(dto.getExamId(), dto.getPaperNumber(), dto.getSerialNumber(), examCard.getPaperId());
                 }
+                this.updateMarkSheetConfig(dto, examCard.getContent());
             }
         }
     }
 
     @Override
-    public void insertScanAnswerCard(ExamDetailCourseInitMarkDto dto, String paperType, PaperInfoVo paperInfoVo, String content) {
-        ExamCard examCard = examCardService.getById(paperInfoVo.getCardId());
+    public void insertScanAnswerCard(ExamDetailCourseInitMarkDto dto, String cardId, String content) {
+        ExamCard examCard = examCardService.getById(cardId);
         if (examCard != null) {
-            ScanAnswerCard scanAnswerCard = scanAnswerCardService.getByExamIdAndCoursePaperIdAndPaperTypeAndCardId(dto.getExamId(), dto.getCoursePaperId(), paperType, Long.valueOf(paperInfoVo.getCardId()));
+            ScanAnswerCard scanAnswerCard = scanAnswerCardService.getByExamIdAndCoursePaperIdAndSerialNumberAndCardId(dto.getExamId(), dto.getCoursePaperId(), dto.getSerialNumber(), Long.valueOf(cardId));
             if (scanAnswerCard != null) {
                 return;
             }
 
             File tempFile = SystemConstant.getFileTempDirVar(System.currentTimeMillis() + File.separator + SystemConstant.getNanoId(), SystemConstant.TEMP_PREFIX);
             String rootPath = tempFile.getParent();
-            String jsonPath = rootPath + File.separator + paperInfoVo.getCardId() + SystemConstant.JSON_PREFIX;
+            String jsonPath = rootPath + File.separator + cardId + SystemConstant.JSON_PREFIX;
 
             InputStream inputStream = null;
             File jsonFile = null;
@@ -199,8 +201,9 @@ public class PrintFinishServiceImpl implements PrintFinishService {
                     scanAnswerCard.setExamId(dto.getExamId());
                     scanAnswerCard.setPaperNumber(dto.getPaperNumber());
                     scanAnswerCard.setCoursePaperId(dto.getCoursePaperId());
-                    scanAnswerCard.setPaperType(paperType);
-                    scanAnswerCard.setCardId(Long.valueOf(paperInfoVo.getCardId()));
+                    scanAnswerCard.setSerialNumber(dto.getSerialNumber());
+                    scanAnswerCard.setPaperType(dto.getPaperType());
+                    scanAnswerCard.setCardId(Long.valueOf(cardId));
                     scanAnswerCard.setNumber(number);
                     scanAnswerCard.setSource(CardSource.WEB);
                     scanAnswerCard.setUri(uploadPath);
@@ -213,7 +216,7 @@ public class PrintFinishServiceImpl implements PrintFinishService {
                     scanAnswerCardService.save(scanAnswerCard);
                 }
             } catch (IOException e) {
-                log.info("考试[{}],试卷编号[{}],题卡ID[{}]同步阅卷失败", dto.getExamId(), dto.getPaperNumber(), paperInfoVo.getCardId());
+                log.info("考试[{}],试卷编号[{}],题卡ID[{}]同步阅卷失败", dto.getExamId(), dto.getPaperNumber(), cardId);
             } finally {
                 try {
                     FileUtils.forceDeleteOnExit(jsonFile);
@@ -234,55 +237,78 @@ public class PrintFinishServiceImpl implements PrintFinishService {
     }
 
     @Override
-    public void insertMarkQuestion(Long examId, String paperNumber, String paperType, String content) {
+    public void insertMarkQuestion(Long examId, String paperNumber, Integer serialNumber, String paperType, String content) {
         try {
             List<Struct> structList = CardParseUtils.parseCardContent(content);
             if (CollectionUtils.isEmpty(structList)) {
                 return;
             }
-            List<MarkQuestion> markQuestionList = markQuestionService.listQuestionByExamIdAndPaperNumberAndPaperType(examId, paperNumber, paperType);
+            List<MarkQuestion> markQuestionList = markQuestionService.listQuestionByExamIdAndPaperNumberAndSerialNumber(examId, paperNumber, serialNumber);
             // 第一次新增
             if (CollectionUtils.isEmpty(markQuestionList)) {
                 List<MarkQuestion> markQuestions = new ArrayList<>();
-                for (Struct struct : structList) {
-                    MarkQuestion markQuestion = new MarkQuestion();
-                    markQuestion.setId(SystemConstant.getDbUuid());
-                    markQuestion.setExamId(examId);
-                    markQuestion.setPaperNumber(paperNumber);
-                    markQuestion.setPaperType(paperType);
-                    markQuestion.setObjective(struct.getObjective());
-                    markQuestion.setMainNumber(struct.getMainNumber());
-                    markQuestion.setSubNumber(struct.getSubNumber());
-                    markQuestion.setMainTitle(struct.getMainTitle());
-                    markQuestion.setOptionCount(struct.getOptionCount());
-                    markQuestion.setQuestionType(struct.getType());
-                    markQuestion.setPaperIndex(struct.getPaperIndex());
-                    markQuestion.setPageIndex(struct.getPageIndex());
-                    if (StringUtils.isNotBlank(struct.getAnswer())) {
-                        // 客观题有标答时,给分策略默认为全对给分
-                        markQuestion.setAnswer(struct.getAnswer());
-                        markQuestion.setObjectivePolicy(ObjectivePolicy.NONE);
+                AtomicInteger i = new AtomicInteger(1);
+                for (String pType : paperType.split(",")) {
+                    if (i.getAndIncrement() == 1) {
+                        for (Struct struct : structList) {
+                            // 保存主观题结构(主观题卷型为空)
+                            if (struct.getObjective()) {
+                                continue;
+                            }
+                            MarkQuestion markQuestion = new MarkQuestion();
+                            markQuestion.setId(SystemConstant.getDbUuid());
+                            markQuestion.setExamId(examId);
+                            markQuestion.setPaperNumber(paperNumber);
+                            markQuestion.setSerialNumber(serialNumber);
+                            markQuestion.setObjective(struct.getObjective());
+                            markQuestion.setMainNumber(struct.getMainNumber());
+                            markQuestion.setSubNumber(struct.getSubNumber());
+                            markQuestion.setMainTitle(struct.getMainTitle());
+                            markQuestion.setOptionCount(struct.getOptionCount());
+                            markQuestion.setQuestionType(struct.getType());
+                            markQuestion.setPaperIndex(struct.getPaperIndex());
+                            markQuestion.setPageIndex(struct.getPageIndex());
+                            if (struct.getScore() != null) {
+                                markQuestion.setTotalScore(struct.getScore());
+                                // 间隔分(整数默认1,小数默认0.5)
+                                if (!markQuestion.getObjective()) {
+                                    markQuestion.setIntervalScore(markQuestion.getTotalScore() % 1 > 0 ? 0.5 : 1);
+                                }
+                            }
+                            markQuestions.add(markQuestion);
+                        }
                     }
-                    if (struct.getScore() != null) {
-                        markQuestion.setTotalScore(struct.getScore());
-                        // 间隔分(整数默认1,小数默认0.5)
-                        if (!markQuestion.getObjective()) {
-                            markQuestion.setIntervalScore(markQuestion.getTotalScore() % 1 > 0 ? 0.5 : 1);
+                    for (Struct struct : structList) {
+                        // 保存客观题结构
+                        if (!struct.getObjective()) {
+                            continue;
+                        }
+                        MarkQuestion markQuestion = new MarkQuestion();
+                        markQuestion.setId(SystemConstant.getDbUuid());
+                        markQuestion.setExamId(examId);
+                        markQuestion.setPaperNumber(paperNumber);
+                        markQuestion.setSerialNumber(serialNumber);
+                        markQuestion.setPaperType(pType);
+                        markQuestion.setObjective(struct.getObjective());
+                        markQuestion.setMainNumber(struct.getMainNumber());
+                        markQuestion.setSubNumber(struct.getSubNumber());
+                        markQuestion.setMainTitle(struct.getMainTitle());
+                        markQuestion.setOptionCount(struct.getOptionCount());
+                        markQuestion.setQuestionType(struct.getType());
+                        markQuestion.setPaperIndex(struct.getPaperIndex());
+                        markQuestion.setPageIndex(struct.getPageIndex());
+                        if (StringUtils.isNotBlank(struct.getAnswer())) {
+                            // 客观题有标答时,给分策略默认为全对给分
+                            markQuestion.setAnswer(struct.getAnswer());
+                            markQuestion.setObjectivePolicy(ObjectivePolicy.NONE);
+                        }
+                        if (struct.getScore() != null) {
+                            markQuestion.setTotalScore(struct.getScore());
                         }
+                        markQuestions.add(markQuestion);
                     }
-                    markQuestions.add(markQuestion);
                 }
                 markQuestionService.saveBatch(markQuestions);
-            } else {
-//                List<ScanAnswerCard> scanAnswerCardList = scanAnswerCardService.listByExamIdAndPaperNumber(examId, paperNumber);
-//                if (CollectionUtils.isNotEmpty(scanAnswerCardList)) {
-//                    for (ScanAnswerCard scanAnswerCard : scanAnswerCardList) {
-//                        int count = scanPaperService.getCountByExamAndCardNumber(examId, scanAnswerCard.getNumber());
-//                        if (count > 0) {
-//                            return;
-//                        }
-//                    }
-//                }
             }
         } catch (Exception e) {
             log.info("同步结构失败");
@@ -290,8 +316,8 @@ public class PrintFinishServiceImpl implements PrintFinishService {
     }
 
     @Override
-    public void insertPaperAnswerFile(Long examId, String paperNumber, String paperType, Long paperId) {
-        MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumberAndPaperType(examId, paperNumber, paperType);
+    public void insertPaperAnswerFile(Long examId, String paperNumber, Integer serialNumber, Long paperId) {
+        MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumberAndSerialNumber(examId, paperNumber, serialNumber);
         if (markPaper != null) {
             ExamTaskPaperData examTaskPaperData = examTaskPaperDataService.selectByMultiId(new ExamTaskPaperData(examId, paperNumber, paperId));
             if (examTaskPaperData != null && examTaskPaperData.getAnswerPdfAttachmentId() != null) {
@@ -307,12 +333,12 @@ public class PrintFinishServiceImpl implements PrintFinishService {
     }
 
     @Override
-    public void insertMarkPaperPackageCode(ExamDetailCourseInitMarkDto dto, String paperType) {
-        List<ExamDetailCourseInitMarkDto> packageCodeList = examDetailService.listPrintFinishPackageCode(dto.getExamId(), dto.getPaperNumber(), paperType);
+    public void insertMarkPaperPackageCode(ExamDetailCourseInitMarkDto dto) {
+        List<ExamDetailCourseInitMarkDto> packageCodeList = examDetailService.listPrintFinishPackageCode(dto.getExamId(), dto.getPaperNumber(), dto.getSerialNumber());
         if (CollectionUtils.isNotEmpty(packageCodeList)) {
             List<MarkPaperPackage> markPaperPackages = new ArrayList<>();
             for (ExamDetailCourseInitMarkDto packageCodeDto : packageCodeList) {
-                markPaperPackages.add(new MarkPaperPackage(packageCodeDto.getExamId(), packageCodeDto.getCourseId(), packageCodeDto.getPaperNumber(), packageCodeDto.getCoursePaperId(), paperType, packageCodeDto.getPackageCode()));
+                markPaperPackages.add(new MarkPaperPackage(packageCodeDto.getExamId(), packageCodeDto.getCourseId(), packageCodeDto.getPaperNumber(), packageCodeDto.getCoursePaperId(), dto.getSerialNumber(), dto.getPaperType(), packageCodeDto.getPackageCode()));
             }
             markPaperPackageService.saveOrUpdateBatchByMultiId(markPaperPackages);
         }