瀏覽代碼

3.4.0 update

xiaofei 11 月之前
父節點
當前提交
f6659d1b49
共有 25 個文件被更改,包括 218 次插入320 次删除
  1. 13 5
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/ExamDetailParams.java
  2. 56 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/ExamTaskSubmitContent.java
  3. 4 4
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/ExamCard.java
  4. 0 43
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/enums/CardStatusEnum.java
  5. 23 22
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/enums/ExamCardStatusEnum.java
  6. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/ExamDetailMapper.java
  7. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamCardService.java
  8. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamDetailService.java
  9. 0 11
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamPrintPlanService.java
  10. 2 12
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/PrintCommonService.java
  11. 0 23
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ActivitiServiceImpl.java
  12. 10 10
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamCardServiceImpl.java
  13. 2 2
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamDetailServiceImpl.java
  14. 0 36
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamPrintPlanServiceImpl.java
  15. 5 9
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskDetailServiceImpl.java
  16. 53 98
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskServiceImpl.java
  17. 6 10
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/PrintCommonServiceImpl.java
  18. 2 8
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/impl/PdfTaskLogicServiceImpl.java
  19. 1 0
      distributed-print-business/src/main/resources/mapper/ExamCardMapper.xml
  20. 3 3
      distributed-print-business/src/main/resources/mapper/ExamDetailMapper.xml
  21. 3 1
      distributed-print/install/mysql/upgrade/3.3.4.sql
  22. 1 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/enums/LockType.java
  23. 1 1
      teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/service/impl/TCFinalScoreServiceImpl.java
  24. 1 1
      teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/service/impl/TCPaperStructServiceImpl.java
  25. 29 18
      teachcloud-task/src/main/java/com/qmth/teachcloud/task/job/service/impl/JobServiceImpl.java

+ 13 - 5
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/ExamDetailParams.java

@@ -16,7 +16,7 @@ public class ExamDetailParams {
     private Double backupCount;
     private Integer totalSubjects; // 总数量,适用于模式2
     private Long printHouseId; // 总印刷室,适用于模式2
-    private String classId; // 适用班级,适用于模式2
+    private String className; // 适用班级,适用于模式2
     private List<ExamDetailList> list;
 
     public Long getExamStartTime() {
@@ -83,12 +83,20 @@ public class ExamDetailParams {
         this.printHouseId = printHouseId;
     }
 
-    public String getClassId() {
-        return classId;
+    public String getCourseId() {
+        return courseId;
     }
 
-    public void setClassId(String classId) {
-        this.classId = classId;
+    public void setCourseId(String courseId) {
+        this.courseId = courseId;
+    }
+
+    public String getClassName() {
+        return className;
+    }
+
+    public void setClassName(String className) {
+        this.className = className;
     }
 
     public List<ExamDetailList> getList() {

+ 56 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/ExamTaskSubmitContent.java

@@ -0,0 +1,56 @@
+package com.qmth.distributed.print.business.bean.params;
+
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.distributed.print.business.entity.ExamTask;
+import com.qmth.distributed.print.business.entity.ExamTaskDetail;
+import com.qmth.teachcloud.common.base.BaseEntity;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * <p>
+ * 命题任务
+ * </p>
+ */
+public class ExamTaskSubmitContent implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "命题任务")
+    private ExamTask examTask;
+
+    @ApiModelProperty(value = "命题任务详情")
+    private ExamTaskDetail examTaskDetail;
+
+    @ApiModelProperty(value = "考场数据")
+    private ExamDetailParams examDetail;
+
+    public ExamTask getExamTask() {
+        return examTask;
+    }
+
+    public void setExamTask(ExamTask examTask) {
+        this.examTask = examTask;
+    }
+
+    public ExamTaskDetail getExamTaskDetail() {
+        return examTaskDetail;
+    }
+
+    public void setExamTaskDetail(ExamTaskDetail examTaskDetail) {
+        this.examTaskDetail = examTaskDetail;
+    }
+
+    public ExamDetailParams getExamDetail() {
+        return examDetail;
+    }
+
+    public void setExamDetail(ExamDetailParams examDetail) {
+        this.examDetail = examDetail;
+    }
+}

+ 4 - 4
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/ExamCard.java

@@ -5,7 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
-import com.qmth.distributed.print.business.enums.CardStatusEnum;
+import com.qmth.distributed.print.business.enums.ExamCardStatusEnum;
 import com.qmth.distributed.print.business.enums.CardTypeEnum;
 import com.qmth.distributed.print.business.enums.MakeMethodEnum;
 import com.qmth.teachcloud.common.base.BaseEntity;
@@ -67,7 +67,7 @@ public class ExamCard extends BaseEntity implements Serializable {
     /**
      * STAGE-暂存,SUBMIT-提交
      */
-    private CardStatusEnum status;
+    private ExamCardStatusEnum status;
 
     /**
      * 题卡类型:GENERIC-通卡,CUSTOM-自定义
@@ -181,11 +181,11 @@ public class ExamCard extends BaseEntity implements Serializable {
         this.makeMethod = makeMethod;
     }
 
-    public CardStatusEnum getStatus() {
+    public ExamCardStatusEnum getStatus() {
         return status;
     }
 
-    public void setStatus(CardStatusEnum status) {
+    public void setStatus(ExamCardStatusEnum status) {
         this.status = status;
     }
 

+ 0 - 43
distributed-print-business/src/main/java/com/qmth/distributed/print/business/enums/CardStatusEnum.java

@@ -1,43 +0,0 @@
-package com.qmth.distributed.print.business.enums;
-
-import com.qmth.teachcloud.common.enums.EnumResult;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * 通用模板类型
- * @Date: 2021/3/23.
- */
-public enum CardStatusEnum {
-
-    STAGE("暂存"),
-    SUBMIT("提交");
-
-    CardStatusEnum(String desc) {
-        this.desc = desc;
-    }
-
-    private String desc;
-
-    public String getDesc() {
-        return desc;
-    }
-
-    /**
-     * @return
-     */
-    public static List<EnumResult> listTypes() {
-        List<EnumResult> list = new ArrayList<EnumResult>();
-        for (CardStatusEnum value : CardStatusEnum.values()) {
-            EnumResult result = new EnumResult();
-            result.setName(value.name());
-            result.setOrdinal(value.ordinal());
-            result.setCode(null);
-            result.setDesc(value.getDesc());
-            list.add(result);
-        }
-        return list;
-    }
-
-}

+ 23 - 22
distributed-print-business/src/main/java/com/qmth/distributed/print/business/enums/ExamCardStatusEnum.java

@@ -1,42 +1,43 @@
 package com.qmth.distributed.print.business.enums;
 
-import java.util.Objects;
+import com.qmth.teachcloud.common.enums.EnumResult;
+
+import java.util.ArrayList;
+import java.util.List;
 
 /**
- * @Description: 题卡status enum
- * @Param:
- * @return:
- * @Author: wangliang
- * @Date: 2021/4/9
+ * 通用模板类型
+ * @Date: 2021/3/23.
  */
 public enum ExamCardStatusEnum {
 
     STAGE("暂存"),
-
     SUBMIT("提交");
 
-    private String title;
-
-    private ExamCardStatusEnum(String title) {
-        this.title = title;
+    ExamCardStatusEnum(String desc) {
+        this.desc = desc;
     }
 
-    public String getTitle() {
-        return title;
+    private String desc;
+
+    public String getDesc() {
+        return desc;
     }
 
     /**
-     * 状态转换 toName
-     *
-     * @param value
      * @return
      */
-    public static String convertToName(String value) {
-        for (ExamCardStatusEnum e : ExamCardStatusEnum.values()) {
-            if (Objects.equals(value.trim(), e.getTitle())) {
-                return e.name();
-            }
+    public static List<EnumResult> listTypes() {
+        List<EnumResult> list = new ArrayList<EnumResult>();
+        for (ExamCardStatusEnum value : ExamCardStatusEnum.values()) {
+            EnumResult result = new EnumResult();
+            result.setName(value.name());
+            result.setOrdinal(value.ordinal());
+            result.setCode(null);
+            result.setDesc(value.getDesc());
+            list.add(result);
         }
-        return null;
+        return list;
     }
+
 }

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

@@ -120,7 +120,7 @@ public interface ExamDetailMapper extends BaseMapper<ExamDetail> {
 
     SummarizedDataResult findSummarizedData(@Param("schoolId") Long schoolId, @Param("semesterId") Long semesterId, @Param("examId") Long examId, @Param("printPlanIdList") List<Long> printPlanIdList, @Param("courseId") Long courseId, @Param("paperNumber") String paperNumber, @Param("examPlace") String examPlace, @Param("examRoom") String examRoom, @Param("packageCode") String packageCode, @Param("startDate") Long startDate, @Param("endDate") Long endDate, @Param("dpr") DataPermissionRule dpr);
 
-    List<ExamDetailCourseDto> listByExamIdAndCourseCode(@Param("schoolId") Long schoolId, @Param("examId") Long examId, @Param("courseCode") String courseCode);
+    List<ExamDetailCourseDto> listByExamIdAndCourseId(@Param("schoolId") Long schoolId, @Param("examId") Long examId, @Param("courseId") Long courseId);
 
     List<ExamDetailCourseInitMarkDto> listPrintFinishExamDetailCourse(@Param("printStatus") String printStatus, @Param("startTime") long startTime, @Param("markStatus") String markStatus);
 

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

@@ -48,5 +48,5 @@ public interface ExamCardService extends IService<ExamCard> {
 
     boolean enable(Long id, Boolean enable);
 
-    void updateUsedByIds(Boolean used, List<Long> cardIds);
+    void updateUsedById(Boolean used, List<Long> cardIds);
 }

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

@@ -217,7 +217,7 @@ public interface ExamDetailService extends IService<ExamDetail> {
 
     List<ExamStudent> listStudentByExamDetailId(String examDetailId);
 
-    List<ExamDetailCourseDto> listByExamIdAndCourseCode(Long schoolId, Long examId, String courseCode);
+    List<ExamDetailCourseDto> listByExamIdAndCourseId(Long schoolId, Long examId, Long courseId);
 
     void deleteByExamIdAndPaperNumber(Long schoolId, Long examId, String paperNumber);
 

+ 0 - 11
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamPrintPlanService.java

@@ -90,17 +90,6 @@ public interface ExamPrintPlanService extends IService<ExamPrintPlan> {
      */
     ExamPrintPlan findByExamDetailId(Long examDetailId);
 
-//    void sendNoticeUploadStructure(Long id, SysUser sysUser);
-
-    /**
-     * 根据学校id和试卷编号查询印刷计划
-     *
-     * @param schoolId    学校id
-     * @param paperNumber 试卷编号
-     * @return 印刷计划
-     */
-    List<ExamPrintPlan> findByPaperNumber(Long schoolId, String paperNumber);
-
     void updateAttachmentIdByTemplateId(Long templateId, Long attachmentId);
 
     void updateStatusById(Long printPlanId, PrintPlanStatusEnum status);

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

@@ -134,11 +134,8 @@ public interface PrintCommonService {
 
     /**
      * 生成唯一的试卷编号
-     *
-     * @param schoolId
-     * @return
      */
-    String createPaperNumber(Long schoolId, Long examId);
+    String autoCreatePaperNumber(Long examId);
 
     /**
      * 校验是否可以提交
@@ -172,15 +169,8 @@ public interface PrintCommonService {
 
     /**
      * 成绩管理导入excel校验
-     *
-     * @param file
-     * @param cultureProgramId
-     * @param courseCode
-     * @param paperNumber
-     * @param courseId
-     * @return
      */
-    public MarkPaper scoreImportExcelVaild(MultipartFile file, Long cultureProgramId, String courseCode, String paperNumber, Long courseId) throws IOException;
+    public MarkPaper scoreImportExcelValid(MultipartFile file, Long cultureProgramId, String courseCode, String paperNumber, Long courseId) throws IOException;
 
     /**
      * 获取阅卷数据

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

@@ -834,29 +834,6 @@ public class ActivitiServiceImpl implements ActivitiService {
             tfFlowApprove.setRejectLink(JacksonUtil.parseJson(rejectLinkMap));
         }
 
-        // 驳回给命题任务发起人,需要清除绑定的题卡id
-//        if (approvePass == FlowApprovePassEnum.REJECT && nextFlowTaskResult.getSetup() == 1) {
-//            ExamTask examTask = examTaskService.findByFlowId(tfFlowLog.getFlowId());
-//            ExamTaskDetail examTaskDetail = examTaskDetailService.getByExamTaskId(examTask.getId());
-//            String paperAttachmentIds = examTaskDetail.getPaperAttachmentIds();
-//            if (StringUtils.isNotBlank(paperAttachmentIds)) {
-//                List<PaperInfoVo> paperInfoVoList = ExamTaskUtil.parsePaperAttachmentPath(paperAttachmentIds);
-//                List<String> cardIds = new ArrayList<>();
-//                for (PaperInfoVo paperInfoVo : paperInfoVoList) {
-//                    cardIds.add(paperInfoVo.getCardId());
-//                    paperInfoVo.setCardId(null);
-//                    paperInfoVo.setCardType(null);
-//                    paperInfoVo.setCardTitle(null);
-//                }
-//                examTaskDetail.setPaperAttachmentIds(JSON.toJSONString(paperInfoVoList));
-//                examTaskDetailService.updateById(examTaskDetail);
-//
-//                // 更新题卡为未使用
-//                UpdateWrapper<ExamCard> updateWrapper = new UpdateWrapper<>();
-//                updateWrapper.lambda().set(ExamCard::getUsed, false).in(ExamCard::getId, cardIds);
-//                examCardService.update(updateWrapper);
-//            }
-//        }
     }
 
     /**

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

@@ -12,7 +12,7 @@ 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.entity.*;
-import com.qmth.distributed.print.business.enums.CardStatusEnum;
+import com.qmth.distributed.print.business.enums.ExamCardStatusEnum;
 import com.qmth.distributed.print.business.enums.CardTypeEnum;
 import com.qmth.distributed.print.business.enums.MakeMethodEnum;
 import com.qmth.distributed.print.business.mapper.ExamCardMapper;
@@ -147,7 +147,7 @@ public class ExamCardServiceImpl extends ServiceImpl<ExamCardMapper, ExamCard> i
         }
 
         // 自动保存
-        if (CardStatusEnum.SUBMIT.equals(examCardParams.getStatus())) {
+        if (ExamCardStatusEnum.SUBMIT.equals(examCardParams.getStatus())) {
             examCard.setContent(examCardParams.getContent());
             examCard.setStageContent(null);
             examCard.setHtmlContent(examCardParams.getHtmlContent());
@@ -244,7 +244,7 @@ public class ExamCardServiceImpl extends ServiceImpl<ExamCardMapper, ExamCard> i
             examCard.setTitle(params.getTitle());
             examCard.setMakeMethod(MakeMethodEnum.SELECT); // 默认值
             // 上传题卡,状态为提交
-            examCard.setStatus(CardCreateMethodEnum.UPLOAD.equals(params.getCreateMethod()) ? CardStatusEnum.SUBMIT : CardStatusEnum.valueOf(params.getStatus()));
+            examCard.setStatus(CardCreateMethodEnum.UPLOAD.equals(params.getCreateMethod()) ? ExamCardStatusEnum.SUBMIT : ExamCardStatusEnum.valueOf(params.getStatus()));
             examCard.setType(CardTypeEnum.GENERIC); // 默认值
             examCard.setCreateMethod(params.getCreateMethod());
             examCard.setAttachmentId(params.getAttachmentId());
@@ -274,7 +274,7 @@ public class ExamCardServiceImpl extends ServiceImpl<ExamCardMapper, ExamCard> i
             // 方式为自定义
             else if (CardCreateMethodEnum.STANDARD.equals(params.getCreateMethod())
                     || CardCreateMethodEnum.FREE.equals(params.getCreateMethod())) {
-                if (CardStatusEnum.SUBMIT.name().equals(params.getStatus())) {
+                if (ExamCardStatusEnum.SUBMIT.name().equals(params.getStatus())) {
                     examCard.setContent(params.getContent());
                     examCard.setStageContent(null);
                     htmlContent = params.getHtmlContent();
@@ -296,7 +296,7 @@ public class ExamCardServiceImpl extends ServiceImpl<ExamCardMapper, ExamCard> i
             examCard.setAttachmentId(params.getAttachmentId());
             examCard.setCardRuleId(params.getCardRuleId());
             // 上传题卡,状态为提交
-            examCard.setStatus(CardCreateMethodEnum.UPLOAD.equals(params.getCreateMethod()) ? CardStatusEnum.SUBMIT : CardStatusEnum.valueOf(params.getStatus()));
+            examCard.setStatus(CardCreateMethodEnum.UPLOAD.equals(params.getCreateMethod()) ? ExamCardStatusEnum.SUBMIT : ExamCardStatusEnum.valueOf(params.getStatus()));
             examCard.setRemark(params.getRemark());
             examCard.setUpdateId(sysUser.getId());
             examCard.setUpdateTime(System.currentTimeMillis());
@@ -317,11 +317,11 @@ public class ExamCardServiceImpl extends ServiceImpl<ExamCardMapper, ExamCard> i
                 htmlContent = teachcloudCommonService.readFileContent(attachment.getPath());
                 examCard.setHtmlContent(htmlContent);
                 // 上传题卡,状态为提交
-                examCard.setStatus(CardStatusEnum.SUBMIT);
+                examCard.setStatus(ExamCardStatusEnum.SUBMIT);
             }
             // 方式为自定义
             else if (CardCreateMethodEnum.STANDARD.equals(params.getCreateMethod()) || CardCreateMethodEnum.FREE.equals(params.getCreateMethod())) {
-                if (CardStatusEnum.SUBMIT.name().equals(params.getStatus())) {
+                if (ExamCardStatusEnum.SUBMIT.name().equals(params.getStatus())) {
                     examCard.setContent(params.getContent());
                     examCard.setStageContent(null);
                     htmlContent = params.getHtmlContent();
@@ -333,7 +333,7 @@ public class ExamCardServiceImpl extends ServiceImpl<ExamCardMapper, ExamCard> i
                 throw ExceptionResultEnum.ERROR.exception("不存在的题卡创建方式");
             }
         }
-        if (CardStatusEnum.SUBMIT.name().equals(params.getStatus())) {
+        if (ExamCardStatusEnum.SUBMIT.name().equals(params.getStatus())) {
             // 生成题卡图片
             createJpgImage(examCard);
         }
@@ -562,7 +562,7 @@ public class ExamCardServiceImpl extends ServiceImpl<ExamCardMapper, ExamCard> i
                 if (StringUtils.isBlank(examCardParams.getContent())) {
                     throw ExceptionResultEnum.ERROR.exception("题卡内容不能为空");
                 }
-                if (CardStatusEnum.SUBMIT.name().equals(examCardParams.getStatus().name())) {
+                if (ExamCardStatusEnum.SUBMIT.name().equals(examCardParams.getStatus().name())) {
                     if (StringUtils.isBlank(examCardParams.getHtmlContent())) {
                         throw ExceptionResultEnum.ERROR.exception("提交题卡时,html内容不能为空");
                     }
@@ -630,7 +630,7 @@ public class ExamCardServiceImpl extends ServiceImpl<ExamCardMapper, ExamCard> i
     }
 
     @Override
-    public void updateUsedByIds(Boolean used, List<Long> cardIds) {
+    public void updateUsedById(Boolean used, List<Long> cardIds) {
         this.update(new UpdateWrapper<ExamCard>()
                 .lambda()
                 .set(ExamCard::getUsed, used)

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

@@ -979,8 +979,8 @@ public class ExamDetailServiceImpl extends ServiceImpl<ExamDetailMapper, ExamDet
     }
 
     @Override
-    public List<ExamDetailCourseDto> listByExamIdAndCourseCode(Long schoolId, Long examId, String courseCode) {
-        return this.baseMapper.listByExamIdAndCourseCode(schoolId, examId, courseCode);
+    public List<ExamDetailCourseDto> listByExamIdAndCourseId(Long schoolId, Long examId, Long courseId) {
+        return this.baseMapper.listByExamIdAndCourseId(schoolId, examId, courseId);
     }
 
     @Override

+ 0 - 36
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamPrintPlanServiceImpl.java

@@ -323,42 +323,6 @@ public class ExamPrintPlanServiceImpl extends ServiceImpl<ExamPrintPlanMapper, E
         return examPrintPlan;
     }
 
-//    @Override
-//    public void sendNoticeUploadStructure(Long id, SysUser sysUser) {
-//        List<ExamDetailCourse> examDetailCourses = examDetailService.listSyncPaperNumberByPrintPlanId(id);
-//        for (ExamDetailCourse examDetailCours : examDetailCourses) {
-//            ExamTask examTask = examTaskService.getByCourseCodeAndPaperNumber(examDetailCours.getSchoolId(), examDetailCours.getCourseCode(), examDetailCours.getPaperNumber());
-//            basicMessageService.sendNoticeUploadStructure(examTask.getPaperNumber(), examTask.getCourseCode(), examTask.getCourseName(), examTask.getUserId(), MessageEnum.NOTICE_OF_UPLOAD_STRUCTURE, sysUser);
-//        }
-//    }
-
-    @Override
-    public List<ExamPrintPlan> findByPaperNumber(Long schoolId, String paperNumber) {
-        Set<Long> examDetailIdSet = examDetailCourseService.list(new QueryWrapper<ExamDetailCourse>()
-                        .lambda()
-                        .eq(ExamDetailCourse::getSchoolId, schoolId)
-                        .eq(ExamDetailCourse::getPaperNumber, paperNumber))
-                .stream()
-                .map(ExamDetailCourse::getExamDetailId)
-                .collect(Collectors.toSet());
-
-        Set<Long> examPrintPlanIdSet = new HashSet<>();
-        if (examDetailIdSet.size() > 0) {
-            examPrintPlanIdSet = examDetailService.list(new QueryWrapper<ExamDetail>()
-                            .lambda()
-                            .in(ExamDetail::getId, examDetailIdSet))
-                    .stream()
-                    .map(ExamDetail::getPrintPlanId)
-                    .collect(Collectors.toSet());
-        }
-
-        List<ExamPrintPlan> examPrintPlanList = new ArrayList<>();
-        if (examPrintPlanIdSet.size() > 0) {
-            examPrintPlanList = this.list(new QueryWrapper<ExamPrintPlan>().lambda().in(ExamPrintPlan::getId, examPrintPlanIdSet));
-        }
-        return examPrintPlanList;
-    }
-
     @Override
     public void updateAttachmentIdByTemplateId(Long templateId, Long attachmentId) {
         Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());

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

@@ -263,7 +263,7 @@ public class ExamTaskDetailServiceImpl extends ServiceImpl<ExamTaskDetailMapper,
             this.updateBatchById(examTaskDetails);
 
             // 更新题卡使用状态
-            examCardService.updateUsedByIds(false, cardIds);
+            examCardService.updateUsedById(false, cardIds);
         }
     }
 
@@ -792,19 +792,15 @@ public class ExamTaskDetailServiceImpl extends ServiceImpl<ExamTaskDetailMapper,
         // 将旧题卡更新为未绑定
         List<PaperInfoVo> oldPaperAttachmentIdsJson = ExamTaskUtil.parsePaperAttachmentPath(examTaskDetailTemp.getPaperAttachmentIds());
         List<Long> oldCardIds = oldPaperAttachmentIdsJson.stream().filter(m -> CardTypeEnum.CUSTOM.name().equals(m.getCardType())).map(m -> Long.parseLong(m.getCardId())).collect(Collectors.toList());
-        for (Long cardId : oldCardIds) {
-            UpdateWrapper<ExamCard> cardUpdateWrapper = new UpdateWrapper<>();
-            cardUpdateWrapper.lambda().set(ExamCard::getUsed, false).eq(ExamCard::getId, cardId);
-            examCardService.update(cardUpdateWrapper);
+        if (CollectionUtils.isNotEmpty(oldCardIds)) {
+            examCardService.updateUsedById(false, oldCardIds);
         }
 
         // 将新题卡更新为已绑定
         List<PaperInfoVo> newPaperAttachmentIdsJson = ExamTaskUtil.parsePaperAttachmentPath(examTaskDetail.getPaperAttachmentIds());
         List<Long> cardIds = newPaperAttachmentIdsJson.stream().filter(m -> CardTypeEnum.CUSTOM.name().equals(m.getCardType())).map(m -> Long.valueOf(m.getCardId())).collect(Collectors.toList());
-        for (Long cardId : cardIds) {
-            UpdateWrapper<ExamCard> cardUpdateWrapper = new UpdateWrapper<>();
-            cardUpdateWrapper.lambda().set(ExamCard::getUsed, true).eq(ExamCard::getId, cardId);
-            examCardService.update(cardUpdateWrapper);
+        if (CollectionUtils.isNotEmpty(cardIds)) {
+            examCardService.updateUsedById(true, cardIds);
         }
     }
 }

+ 53 - 98
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskServiceImpl.java

@@ -45,6 +45,7 @@ import org.activiti.engine.ActivitiObjectNotFoundException;
 import org.activiti.engine.TaskService;
 import org.activiti.engine.task.Task;
 import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.MapUtils;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
@@ -303,9 +304,7 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
                     throw ExceptionResultEnum.ERROR.exception("试卷编号[" + examTask.getPaperNumber() + "]在考试[" + basicExam.getName() + "]下已存在");
                 }
             } else {
-                // 试卷编号生成规则:年月日(例如:20100419)+0000(例如:0001)顺序编号
-                String paperNumber = printCommonService.createPaperNumber(schoolId, examId);
-                examTask.setPaperNumber(paperNumber);
+                examTask.setPaperNumber(printCommonService.autoCreatePaperNumber(examId));
             }
 
             examTask.insertInfo(sysUser.getId());
@@ -583,8 +582,7 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
                     continue;
                 }
             } else {
-                // 试卷编号生成规则:年月日(例如:20100419)+0000(例如:0001)顺序编号
-                paperNumber = printCommonService.createPaperNumber(schoolId, examId);
+                paperNumber = printCommonService.autoCreatePaperNumber(examId);
             }
             examTask.setPaperNumber(paperNumber);
             examTask.setStartTime(task.getStartTime());
@@ -765,11 +763,9 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
 
         // 将题卡更新为已绑定
         List<PaperInfoVo> paperAttachmentIdsJson = ExamTaskUtil.parsePaperAttachmentPath(examTaskDetail.getPaperAttachmentIds());
-        List<String> cardIds = paperAttachmentIdsJson.stream().filter(m -> CardTypeEnum.CUSTOM.name().equals(m.getCardType())).map(m -> m.getCardId()).collect(Collectors.toList());
-        for (String cardId : cardIds) {
-            UpdateWrapper<ExamCard> cardUpdateWrapper = new UpdateWrapper<>();
-            cardUpdateWrapper.lambda().set(ExamCard::getUsed, true).eq(ExamCard::getId, cardId);
-            examCardService.update(cardUpdateWrapper);
+        List<Long> cardIds = paperAttachmentIdsJson.stream().filter(m -> CardTypeEnum.CUSTOM.name().equals(m.getCardType())).map(m -> Long.valueOf(m.getCardId())).collect(Collectors.toList());
+        if (CollectionUtils.isNotEmpty(cardIds)) {
+            examCardService.updateUsedById(true, cardIds);
         }
         return map;
     }
@@ -802,26 +798,6 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
         map.computeIfAbsent(SystemConstant.APPROVE_SETUP, v -> FlowApproveSetupEnum.SUBMIT.getSetup());
         activitiService.taskApprove(map);
 
-        // 清除cardId
-//        ExamTaskDetail examTaskDetail = examTaskDetailService.getByExamTaskId(examTask.getId());
-//        String paperAttachmentIds = examTaskDetail.getPaperAttachmentIds();
-//        if (StringUtils.isNotBlank(paperAttachmentIds)) {
-//            List<PaperInfoVo> paperInfoVoList = ExamTaskUtil.parsePaperAttachmentPath(paperAttachmentIds);
-//            List<String> cardIds = new ArrayList<>();
-//            for (PaperInfoVo paperInfoVo : paperInfoVoList) {
-//                cardIds.add(paperInfoVo.getCardId());
-//                paperInfoVo.setCardId(null);
-//                paperInfoVo.setCardType(null);
-//                paperInfoVo.setCardTitle(null);
-//            }
-//            examTaskDetail.setPaperAttachmentIds(JSON.toJSONString(paperInfoVoList));
-//            examTaskDetailService.updateById(examTaskDetail);
-//
-//            // 更新题卡为未使用
-//            UpdateWrapper<ExamCard> updateWrapper = new UpdateWrapper<>();
-//            updateWrapper.lambda().set(ExamCard::getUsed, false).in(ExamCard::getId, cardIds);
-//            examCardService.update(updateWrapper);
-//        }
         return map;
     }
 
@@ -1020,9 +996,7 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
     public void removeByExamTaskId(Long examTaskId) {
         // 删除任务
         this.removeById(examTaskId);
-        QueryWrapper<ExamTaskDetail> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().eq(ExamTaskDetail::getExamTaskId, examTaskId);
-        ExamTaskDetail examTaskDetail = examTaskDetailService.getOne(queryWrapper);
+        ExamTaskDetail examTaskDetail = examTaskDetailService.getByExamTaskId(examTaskId);
         if (examTaskDetail != null) {
             examTaskDetailService.removeById(examTaskDetail.getId());
 
@@ -1037,9 +1011,7 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
                     Long cardId = Long.valueOf(paperInfoVo.getCardId());
                     ExamCard examCard = examCardService.getById(cardId);
                     if (examCard.getType().equals(CardTypeEnum.CUSTOM) || (examCard.getType().equals(CardTypeEnum.GENERIC) && examCard.getCreateMethod().equals(CardCreateMethodEnum.STANDARD))) {
-                        UpdateWrapper<ExamCard> updateWrapper = new UpdateWrapper<>();
-                        updateWrapper.lambda().set(ExamCard::getUsed, false).eq(ExamCard::getId, cardId);
-                        examCardService.update(updateWrapper);
+                        examCardService.updateUsedById(false, Arrays.asList(new Long[]{cardId}));
                     }
                 }
             }
@@ -1047,27 +1019,20 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
     }
 
     /**
-     * 校验输入的试卷编号是否存在
-     *
-     * @param schoolId
-     * @param examTask
+     * 校验输入的试卷编号是否使用
      */
-    public void validPaperNumberExists(Long schoolId, ExamTask examTask) {
-        boolean lock = redisUtil.lock(SystemConstant.REDIS_LOCK_PAPER_NUMBER_PREFIX + schoolId + examTask.getExamId() + examTask.getPaperNumber(), SystemConstant.REDIS_LOCK_PAPER_NUMBER_TIME_OUT);
+    public void validPaperNumberExists(ExamTask examTask) {
+        boolean lock = redisUtil.lock(SystemConstant.REDIS_LOCK_PAPER_NUMBER_PREFIX + examTask.getExamId() + examTask.getPaperNumber(), SystemConstant.REDIS_LOCK_PAPER_NUMBER_TIME_OUT);
         if (!lock) {
-            throw ExceptionResultEnum.ERROR.exception("正在校验试卷编号中,请稍候再试!");
+            throw ExceptionResultEnum.ERROR.exception("正在校验试卷编号,请稍后再试");
         }
         try {
-            QueryWrapper<ExamTask> taskQueryWrapper = new QueryWrapper<>();
-            taskQueryWrapper.lambda().eq(ExamTask::getSchoolId, schoolId)
-                    .eq(ExamTask::getExamId, examTask.getExamId())
-                    .eq(ExamTask::getPaperNumber, examTask.getPaperNumber());
-            ExamTask task = this.getOne(taskQueryWrapper);
+            ExamTask task = this.getByExamIdAndCourseIdAndPaperNumber(examTask.getExamId(), null, examTask.getPaperNumber());
             if (task != null) {
-                throw ExceptionResultEnum.ERROR.exception("试卷编号已存在");
+                throw ExceptionResultEnum.ERROR.exception("试卷编号已使用");
             }
         } finally {
-            redisUtil.releaseLock(SystemConstant.REDIS_LOCK_PAPER_NUMBER_PREFIX + schoolId + examTask.getExamId() + examTask.getPaperNumber());
+            redisUtil.releaseLock(SystemConstant.REDIS_LOCK_PAPER_NUMBER_PREFIX + examTask.getExamId() + examTask.getPaperNumber());
         }
     }
 
@@ -1077,11 +1042,12 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
         Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
 
-        JSONObject jsonObject = JSONObject.parseObject(examTaskSubmitPram.getExamTaskContent());
+        ExamTaskSubmitContent examTaskSubmitContent = JSON.parseObject(examTaskSubmitPram.getExamTaskContent(), ExamTaskSubmitContent.class);
         // 新建命题任务
-        ExamTask examTask = JSONObject.parseObject(String.valueOf(jsonObject.get("examTask")), ExamTask.class);
+        ExamTask examTask = examTaskSubmitContent.getExamTask();
         BasicPrintConfig basicPrintConfig = basicPrintConfigService.getByExamId(examTask.getExamId());
 
+        // 开启了入库审核
         if (basicPrintConfig.getReview()) {
             Long customFlowId = examTaskSubmitPram.getCustomFlowId();
             Optional.ofNullable(customFlowId).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("自定义流程ID为空"));
@@ -1102,11 +1068,9 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
         Map<String, Object> mapVar = new HashMap<>();
         try {
             if (StringUtils.isNotBlank(examTask.getPaperNumber())) {
-                validPaperNumberExists(schoolId, examTask);
+                validPaperNumberExists(examTask);
             } else {
-                // 试卷编号生成规则:年月日(例如:20100419)+0000(例如:0001)顺序编号
-                String paperNumber = printCommonService.createPaperNumber(schoolId, examTask.getExamId());
-                examTask.setPaperNumber(paperNumber);
+                examTask.setPaperNumber(printCommonService.autoCreatePaperNumber(examTask.getExamId()));
             }
 
             examTask.setId(SystemConstant.getDbUuid());
@@ -1130,7 +1094,7 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
             this.save(examTask);
 
             // 新建试卷
-            ExamTaskDetail examTaskDetail = JSONObject.parseObject(String.valueOf(jsonObject.get("examTaskDetail")), ExamTaskDetail.class);
+            ExamTaskDetail examTaskDetail = examTaskSubmitContent.getExamTaskDetail();
             validSubmitParam(examTaskDetail, basicPrintConfig.getPrintContent());
             // 已曝光试卷和未曝光试卷赋值(新增时,已曝光试卷为null,未曝光试卷为paper_type)
             examTaskDetail.setId(SystemConstant.getDbUuid());
@@ -1144,9 +1108,7 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
             // 将题卡更新为已绑定
             for (PaperInfoVo paperInfoVo : paperInfoVoList) {
                 if (CardTypeEnum.CUSTOM.name().equals(paperInfoVo.getCardType())) {
-                    UpdateWrapper<ExamCard> updateWrapper = new UpdateWrapper<>();
-                    updateWrapper.lambda().set(ExamCard::getUsed, true).eq(ExamCard::getId, paperInfoVo.getCardId());
-                    examCardService.update(updateWrapper);
+                    examCardService.updateUsedById(true, Arrays.asList(new Long[]{Long.valueOf(paperInfoVo.getCardId())}));
                 }
             }
             // 删除临时题卡
@@ -1182,7 +1144,7 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
             BasicExam basicExam = basicExamService.getById(examTask.getExamId());
             if (ExamModelEnum.MODEL1.equals(basicExam.getExamModel()) || ExamModelEnum.MODEL2.equals(basicExam.getExamModel())) {
                 // 创建印刷计划
-                ExamDetailParams examDetailParams = JSONObject.parseObject(String.valueOf(jsonObject.get("examDetail")), ExamDetailParams.class);
+                ExamDetailParams examDetailParams = examTaskSubmitContent.getExamDetail();
                 ExamPrintPlan examPrintPlan = new ExamPrintPlan();
                 examPrintPlan.insertInfo(sysUser.getId());
                 examPrintPlan.setSchoolId(schoolId);
@@ -1211,34 +1173,32 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
                 examPrintPlanService.save(examPrintPlan);
 
                 // 查询考试+课程下已用过的班级
-                Map<String, String> usedClassIdsMap = new HashMap<>();
-                List<ExamDetailCourseDto> examDetailCourseList = examDetailService.listByExamIdAndCourseCode(schoolId, examTask.getExamId(), examTask.getCourseCode());
+                Map<String, String> usedClassNameMap = new HashMap<>();
+                List<ExamDetailCourseDto> examDetailCourseList = examDetailService.listByExamIdAndCourseId(schoolId, examTask.getExamId(), examTask.getCourseId());
                 if (!CollectionUtils.isEmpty(examDetailCourseList)) {
-                    examDetailCourseList.stream().filter(m -> StringUtils.isNotBlank(m.getClazzId())).forEach(m -> {
-                        for (String s : m.getClazzId().split(",")) {
-                            usedClassIdsMap.put(s, String.format("%s(%s)", m.getRealName(), m.getLoginName()));
+                    examDetailCourseList.stream().filter(m -> StringUtils.isNotBlank(m.getClazzName())).forEach(m -> {
+                        for (String className : m.getClazzName().split(",")) {
+                            usedClassNameMap.put(className, String.format("%s(%s)", m.getRealName(), m.getLoginName()));
                         }
                     });
                 }
-                Set<String> classIdSet = usedClassIdsMap.keySet();
 
                 // 已使用过的班级集合(报错用)
-                List<String> errorClassIds = new ArrayList<>();
+                List<String> errorClassNames = new ArrayList<>();
 
                 String paperNumber = examTask.getPaperNumber();
                 if (ExamModelEnum.MODEL1.equals(basicExam.getExamModel())) {
-                    List<ExamDetailList> examDetailLists = JSONObject.parseArray(JSONObject.toJSONString(examDetailParams.getList()), ExamDetailList.class);
-                    for (ExamDetailList examDetailList : examDetailLists) {
+                    for (ExamDetailList examDetailList : examDetailParams.getList()) {
                         int count = examDetailList.getStudentCount();
-                        String clazzName = examDetailList.getClassName();
+                        String className = examDetailList.getClassName();
                         if (count == 0) {
-                            throw ExceptionResultEnum.ERROR.exception("选择的考试班级[" + clazzName + "]下无学生,请确认该班级学生信息");
+                            throw ExceptionResultEnum.ERROR.exception("选择的考试对象[" + className + "]下没有考生");
                         }
 
-                        if (!CollectionUtils.isEmpty(classIdSet)) {
-                            for (String s : examDetailList.getClassId().split(",")) {
-                                if (classIdSet.contains(s)) {
-                                    errorClassIds.add(s);
+                        if (MapUtils.isNotEmpty(usedClassNameMap)) {
+                            for (String name : examDetailList.getClassName().split(",")) {
+                                if (usedClassNameMap.containsKey(name)) {
+                                    errorClassNames.add(name);
                                 }
                             }
                         }
@@ -1274,7 +1234,7 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
                         examDetailCourse.setCourseId(examTask.getCourseId());
                         examDetailCourse.setPaperNumber(paperNumber);
                         examDetailCourse.setCoursePaperId(String.valueOf(examTask.getId()));
-                        examDetailCourse.setClazzId(examDetailList.getClassId());
+                        examDetailCourse.setClazzName(examDetailList.getClassName());
                         examDetailCourse.setTotalSubjects(examDetailList.getStudentCount());
                         examDetailCourse.setCreateId(sysUser.getId());
                         examDetailCourseService.save(examDetailCourse);
@@ -1300,10 +1260,10 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
                         }
                     }
                 } else if (ExamModelEnum.MODEL2.equals(basicExam.getExamModel())) {
-                    if (StringUtils.isNotBlank(examDetailParams.getClassId()) && !CollectionUtils.isEmpty(classIdSet)) {
-                        for (String s : examDetailParams.getClassId().split(",")) {
-                            if (classIdSet.contains(s)) {
-                                errorClassIds.add(s);
+                    if (StringUtils.isNotBlank(examDetailParams.getClassName()) && !MapUtils.isNotEmpty(usedClassNameMap)) {
+                        for (String s : examDetailParams.getClassName().split(",")) {
+                            if (usedClassNameMap.containsKey(s)) {
+                                errorClassNames.add(s);
                             }
                         }
                     }
@@ -1336,35 +1296,30 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
                     examDetailCourse.setCourseCode(examTask.getCourseCode());
                     examDetailCourse.setCourseName(examTask.getCourseName());
                     examDetailCourse.setPaperNumber(paperNumber);
-                    examDetailCourse.setClazzId(examDetailParams.getClassId());
-                    if (StringUtils.isNotBlank(examDetailParams.getClassId())) {
-                        List<BasicTeachClazz> basicClazzList = basicTeachClazzService.listByIds(Arrays.asList(examDetailParams.getClassId().split(",")));
-                        examDetailCourse.setClazzName(basicClazzList.stream().map(BasicTeachClazz::getClazzName).collect(Collectors.joining(",")));
-                    }
+                    examDetailCourse.setClazzName(examDetailParams.getClassName());
                     examDetailCourse.setTotalSubjects(examDetailParams.getTotalSubjects());
                     examDetailCourse.setCreateId(sysUser.getId());
                     examDetailCourseService.save(examDetailCourse);
                 }
 
-                if (!CollectionUtils.isEmpty(errorClassIds)) {
+                if (!CollectionUtils.isEmpty(errorClassNames)) {
                     // 选择学生时,不校验
                     boolean containsPrivilege = teachcloudCommonService.containsPrivilege(sysUser.getId(), "button", "SelectStudent");
                     if (!containsPrivilege || ExamCategoryEnum.REBUILD.equals(basicExam.getCategory())) {
-                        Map<String, List<String>> finalMap = new HashMap<>();
+                        Map<String, Set<String>> finalMap = new HashMap<>();
                         StringJoiner stringJoiner = new StringJoiner(",");
-                        List<BasicTeachClazz> basicClazzList = basicTeachClazzService.listByIds(errorClassIds);
-                        for (BasicTeachClazz basicClazz : basicClazzList) {
-                            String key = usedClassIdsMap.get(basicClazz.getId().toString());
-                            List<String> value;
+                        for (String errorClassName : errorClassNames) {
+                            String key = usedClassNameMap.get(errorClassName);
+                            Set<String> value;
                             if (finalMap.containsKey(key)) {
                                 value = finalMap.get(key);
                             } else {
-                                value = new ArrayList<>();
+                                value = new HashSet<>();
                             }
-                            value.add(basicClazz.getClazzName());
+                            value.add(errorClassName);
                             finalMap.put(key, value);
                         }
-                        for (Map.Entry<String, List<String>> entry : finalMap.entrySet()) {
+                        for (Map.Entry<String, Set<String>> entry : finalMap.entrySet()) {
                             stringJoiner.add("考试对象[" + String.join(",", entry.getValue()) + "]已被" + entry.getKey() + "选择");
                         }
                         if (StringUtils.isNotBlank(stringJoiner.toString())) {
@@ -2068,18 +2023,18 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
     void validSubmitParam(ExamTaskDetail examTaskDetail, String printContent) {
         List<PaperInfoVo> paperInfoVoList = ExamTaskUtil.parsePaperAttachmentPath(examTaskDetail.getPaperAttachmentIds());
         if (StringUtils.isBlank(examTaskDetail.getPaperType()) || CollectionUtils.isEmpty(paperInfoVoList)) {
-            throw ExceptionResultEnum.ERROR.exception("请先设置卷型并上传相关文件");
+            throw ExceptionResultEnum.ERROR.exception("请添加卷型并上传试卷或题卡");
         }
 
         for (PaperInfoVo paperInfoVo : paperInfoVoList) {
             // 校验试卷必须绑定题卡
             Long cardId = Long.valueOf(paperInfoVo.getCardId());
-            if (Objects.isNull(cardId)) {
+            if (printContent.indexOf("PAPER") > 0 && Objects.isNull(cardId)) {
                 throw ExceptionResultEnum.ERROR.exception("卷型[" + paperInfoVo.getName() + "]没有绑定题卡");
             }
             // 校验题卡是否提交
             ExamCard examCard = examCardService.getById(cardId);
-            if (!ExamCardStatusEnum.SUBMIT.name().equals(examCard.getStatus().name())) {
+            if (!ExamCardStatusEnum.SUBMIT.equals(examCard.getStatus())) {
                 throw ExceptionResultEnum.ERROR.exception("卷型[" + paperInfoVo.getName() + "]绑定的题卡未提交");
             }
         }

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

@@ -222,7 +222,7 @@ public class PrintCommonServiceImpl implements PrintCommonService {
      * @throws IOException
      */
     @Override
-    public MarkPaper scoreImportExcelVaild(MultipartFile file, Long cultureProgramId, String courseCode, String paperNumber, Long courseId) throws IOException {
+    public MarkPaper scoreImportExcelValid(MultipartFile file, Long cultureProgramId, String courseCode, String paperNumber, Long courseId) throws IOException {
         String reqFileMd5 = ServletUtil.getRequestMd5();
         String fileMd5 = DigestUtils.md5Hex(file.getBytes());
         if (!Objects.equals(fileMd5, reqFileMd5)) {
@@ -833,20 +833,16 @@ public class PrintCommonServiceImpl implements PrintCommonService {
 
     /**
      * 生成唯一的试卷编号
-     *
-     * @param schoolId
-     * @return
      */
     @Override
-    public String createPaperNumber(Long schoolId, Long examId) {
+    public String autoCreatePaperNumber(Long examId) {
+        // 试卷编号生成规则:年月日(例如:20200101)+00000(例如:00001)顺序编号
         String date = DateUtil.today().replace(SystemConstant.HYPHEN, "");
-        String counter = redisCounterUtil.getCounter(schoolId, 5, "paperNumber", date);
+        String counter = redisCounterUtil.getCounter(examId, 5, "paperNumber", date);
         String paperNumber = date + counter;
-        QueryWrapper<ExamTask> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().eq(ExamTask::getSchoolId, schoolId).eq(ExamTask::getExamId, examId).eq(ExamTask::getPaperNumber, paperNumber);
-        ExamTask examTask = examTaskService.getOne(queryWrapper);
+        ExamTask examTask = examTaskService.getByExamIdAndCourseIdAndPaperNumber(examId, null, paperNumber);
         if (examTask != null) {
-            return createPaperNumber(schoolId, examId);
+            return autoCreatePaperNumber(examId);
         } else {
             return paperNumber;
         }

+ 2 - 8
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/impl/PdfTaskLogicServiceImpl.java

@@ -172,13 +172,7 @@ public class PdfTaskLogicServiceImpl implements PdfTaskLogicService {
         examDetailService.update(examDetailQueryWrapper);
 
         //所有考场都撤回,印刷任务状态改为就绪
-        QueryWrapper<ExamDetail> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().eq(ExamDetail::getPrintPlanId, tbTaskPdf.getPrintPlanId())
-                .notIn(ExamDetail::getStatus, ExamDetailStatusEnum.NEW, ExamDetailStatusEnum.READY);
-        List<ExamDetail> examDetails = examDetailService.list(queryWrapper);
-        if (CollectionUtils.isEmpty(examDetails)) {
-            examPrintPlanService.updateStatusById(tbTaskPdf.getPrintPlanId(), PrintPlanStatusEnum.READY);
-        }
+        examPrintPlanService.updateStatusById(tbTaskPdf.getPrintPlanId(), PrintPlanStatusEnum.READY);
     }
 
     @Transactional
@@ -235,7 +229,7 @@ public class PdfTaskLogicServiceImpl implements PdfTaskLogicService {
             String[] paperTypes = examDetailCourse.getPaperType().split(",");
 
             //查询命题任务绑定的试卷和题卡
-            ExamTask examTask = examTaskService.validExamTaskAuditPass(tbTaskPdf.getSchoolId(),tbTaskPdf.getExamId(), examDetailCourse.getCourseId(), examDetailCourse.getPaperNumber());
+            ExamTask examTask = examTaskService.validExamTaskAuditPass(tbTaskPdf.getSchoolId(), tbTaskPdf.getExamId(), examDetailCourse.getCourseId(), examDetailCourse.getPaperNumber());
             ExamTaskDetail examTaskDetail = examTaskDetailService.getByExamTaskId(examTask.getId());
 
             CreatePdfTypeEnum createPdfType = tbTaskPdf.getCreateType();

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

@@ -64,6 +64,7 @@
             AND a.card_rule_id = #{cardRuleId}
             AND a.create_time >= 1680624000000
             AND a.enable = true
+            AND a.paper_id is null
         order by a.create_time desc
     </select>
     <select id="listPage" resultType="com.qmth.distributed.print.business.entity.ExamCard">

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

@@ -745,10 +745,10 @@
             </if>
         </trim>
     </select>
-    <select id="listByExamIdAndCourseCode"
+    <select id="listByExamIdAndCourseId"
             resultType="com.qmth.distributed.print.business.bean.dto.ExamDetailCourseDto">
         SELECT
-            edc.clazz_id clazzId,
+            edc.clazz_name clazzName,
             su.login_name loginName,
             su.real_name realName
         FROM
@@ -759,7 +759,7 @@
             sys_user su ON ed.create_id = su.id
         WHERE
             edc.school_id = #{schoolId} AND ed.exam_id = #{examId}
-          AND edc.course_code = #{courseCode} AND ed.status != 'CANCEL'
+          AND edc.course_id = #{courseId} AND ed.status != 'CANCEL'
     </select>
     <select id="listPrintFinishExamDetailCourse"
             resultType="com.qmth.distributed.print.business.bean.dto.initMarkData.ExamDetailCourseInitMarkDto">

+ 3 - 1
distributed-print/install/mysql/upgrade/3.3.4.sql

@@ -365,4 +365,6 @@ INSERT INTO sys_privilege
 VALUES(2103, '重新计算', 'Calculate', 'BUTTON', 2080, 4, 'AUTH', '2104', 1, 0, 1);
 INSERT INTO sys_privilege
 (id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display)
-VALUES(2104, '学生毕业要求达成度重新计算', '/api/admin/obe/student_requirement/again/calculate', 'URL', 2080, 3, 'AUTH', NULL, 1, 1, 1);
+VALUES(2104, '学生毕业要求达成度重新计算', '/api/admin/obe/student_requirement/again/calculate', 'URL', 2080, 3, 'AUTH', NULL, 1, 1, 1);
+
+UPDATE `sys_privilege` SET `url` = '/api/admin/course/degree/final_score/template_download' WHERE (`id` = '2014');

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

@@ -18,6 +18,7 @@ public enum LockType {
 	SCHOOL("school"),
 	QUESTION_DELETE("question_delete"),
 	CARD_SAVE("card_save"),
+	INIT_MARK_DATA("init_mark_data"),
 	;
 
 	private String name;

+ 1 - 1
teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/service/impl/TCFinalScoreServiceImpl.java

@@ -111,7 +111,7 @@ public class TCFinalScoreServiceImpl extends ServiceImpl<TCFinalScoreMapper, TCF
         long start = System.currentTimeMillis();
         Map<String, String> messageMap = new LinkedHashMap<>();
         try {
-            printCommonService.scoreImportExcelVaild(file, examId, null, paperNumber, courseId);
+            printCommonService.scoreImportExcelValid(file, examId, null, paperNumber, courseId);
             Double totalScore = 100d;
 
             StringJoiner errorData = new StringJoiner("");

+ 1 - 1
teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/service/impl/TCPaperStructServiceImpl.java

@@ -107,7 +107,7 @@ public class TCPaperStructServiceImpl extends ServiceImpl<TCPaperStructMapper, T
         long start = System.currentTimeMillis();
         Map<String, String> messageMap = new LinkedHashMap<>();
         try {
-            MarkPaper markPaper = printCommonService.scoreImportExcelVaild(file, cultureProgramId, null, paperNumber, courseId);
+            MarkPaper markPaper = printCommonService.scoreImportExcelValid(file, cultureProgramId, null, paperNumber, courseId);
             StringJoiner errorData = new StringJoiner("");
             StringJoiner successData = new StringJoiner("");
 

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

@@ -23,6 +23,8 @@ import com.qmth.teachcloud.common.util.RedisUtil;
 import com.qmth.teachcloud.mark.entity.MarkGroup;
 import com.qmth.teachcloud.mark.entity.MarkPaper;
 import com.qmth.teachcloud.mark.entity.MarkUserGroup;
+import com.qmth.teachcloud.mark.enums.LockType;
+import com.qmth.teachcloud.mark.lock.LockService;
 import com.qmth.teachcloud.mark.service.MarkGroupService;
 import com.qmth.teachcloud.mark.service.MarkPaperService;
 import com.qmth.teachcloud.mark.service.MarkService;
@@ -81,6 +83,8 @@ public class JobServiceImpl implements JobService {
     private BasicCourseService basicCourseService;
     @Resource
     AsyncCreatePdfTemplateService asyncCreatePdfTemplateService;
+    @Resource
+    LockService lockService;
 
     @Override
     public void sendSmsExpireTask() {
@@ -153,27 +157,34 @@ public class JobServiceImpl implements JobService {
         List<ExamDetailCourseInitMarkDto> examDetailCourseInitMarkDtoList = examDetailService.listPrintFinishExamDetailCourse(ExamDetailStatusEnum.FINISH.name(), startTime, MarkPaperStatus.FINISH.name());
         for (ExamDetailCourseInitMarkDto dto : examDetailCourseInitMarkDtoList) {
             for (String paperType : dto.getPaperType().split(",")) {
-                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);
+                    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));
+                    }
                 } catch (Exception e) {
-                    tbSyncTask.setResult(TaskResultEnum.ERROR);
-                    tbSyncTask.setSummary(e.getMessage());
-                    log.info("结束同步失败:" + DateDisposeUtils.dateTimeNow(DateDisposeUtils.YYYY_MM_DD_HH_MM_SS));
+                    log.error("init mark data error", e);
                 } finally {
-                    tbSyncTask.setStatus(TaskStatusEnum.FINISH);
-                    tbSyncTaskService.updateById(tbSyncTask);
-                    log.info("结束同步数据:" + DateDisposeUtils.dateTimeNow(DateDisposeUtils.YYYY_MM_DD_HH_MM_SS));
+                    lockService.unlock(LockType.INIT_MARK_DATA, dto.getExamId(), dto.getPaperNumber(), paperType);
                 }
             }
         }