瀏覽代碼

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

# Conflicts:
#	distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskServiceImpl.java
xiaofei 2 年之前
父節點
當前提交
69dda8910a

+ 28 - 22
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskServiceImpl.java

@@ -1476,17 +1476,7 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
             }
 
             if (StringUtils.isNotBlank(examTask.getPaperNumber())) {
-                QueryWrapper<ExamTask> taskQueryWrapper = new QueryWrapper<>();
-                taskQueryWrapper.lambda().eq(ExamTask::getSchoolId, schoolId)
-                        .eq(ExamTask::getExamId, examId)
-                        .eq(ExamTask::getPaperNumber, examTask.getPaperNumber());
-                if (Objects.nonNull(examTask.getId())) {
-                    taskQueryWrapper.lambda().ne(ExamTask::getId, examTask.getId());
-                }
-                ExamTask task = this.getOne(taskQueryWrapper);
-                if (task != null) {
-                    throw ExceptionResultEnum.ERROR.exception(String.format("试卷编号[%s]在当前考试下已存在"));
-                }
+                validPaperNumberExists(schoolId, examTask);
             } else {
                 // 试卷编号生成规则:年月日(例如:20100419)+0000(例如:0001)顺序编号
                 String paperNumber = printCommonService.createPaperNumber(schoolId, examId);
@@ -1574,6 +1564,32 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
         return examTask;
     }
 
+    /**
+     * 校验输入的试卷编号是否存在
+     *
+     * @param schoolId
+     * @param examTask
+     */
+    public void validPaperNumberExists(Long schoolId, ExamTask examTask) {
+        boolean lock = redisUtil.lock(SystemConstant.REDIS_LOCK_PAPER_NUMBER_PREFIX + schoolId + examTask.getPaperNumber(), SystemConstant.REDIS_LOCK_PAPER_NUMBER_TIME_OUT);
+        if (!lock) {
+            throw ExceptionResultEnum.ERROR.exception("正在校验试卷编号中,请稍候再试!");
+        }
+        try {
+            QueryWrapper<ExamTask> taskQueryWrapper = new QueryWrapper<>();
+            taskQueryWrapper.lambda().eq(ExamTask::getSchoolId, schoolId).eq(ExamTask::getPaperNumber, examTask.getPaperNumber());
+            if (Objects.nonNull(examTask.getId())) {
+                taskQueryWrapper.lambda().ne(ExamTask::getId, examTask.getId());
+            }
+            ExamTask task = this.getOne(taskQueryWrapper);
+            if (task != null) {
+                throw ExceptionResultEnum.ERROR.exception("试卷编号已存在");
+            }
+        } finally {
+            redisUtil.releaseLock(SystemConstant.REDIS_LOCK_PAPER_NUMBER_PREFIX + schoolId + examTask.getPaperNumber());
+        }
+    }
+
     @Override
     public String findCardTitle(Long cardRuleId) {
         String title = "通用题卡";
@@ -1619,17 +1635,7 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
             }
 
             if (StringUtils.isNotBlank(examTask.getPaperNumber())) {
-                QueryWrapper<ExamTask> taskQueryWrapper = new QueryWrapper<>();
-                taskQueryWrapper.lambda().eq(ExamTask::getSchoolId, schoolId)
-                        .eq(ExamTask::getExamId, examTask.getExamId())
-                        .eq(ExamTask::getPaperNumber, examTask.getPaperNumber());
-                if (Objects.nonNull(examTask.getId())) {
-                    taskQueryWrapper.lambda().ne(ExamTask::getId, examTask.getId());
-                }
-                ExamTask task = this.getOne(taskQueryWrapper);
-                if (task != null) {
-                    throw ExceptionResultEnum.ERROR.exception(String.format("试卷编号[%s]在当前考试下已存在"));
-                }
+                validPaperNumberExists(schoolId, examTask);
             } else {
                 // 试卷编号生成规则:年月日(例如:20100419)+0000(例如:0001)顺序编号
                 String paperNumber = printCommonService.createPaperNumber(schoolId, examTask.getExamId());

+ 2 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/contant/SystemConstant.java

@@ -439,6 +439,7 @@ public class SystemConstant {
     public static final String PAPAER_ATTACHMENT_IDS = "paperAttachmentIds";//命题附件ids
     public static final String REDIS_LOCK_FLOW_TASK_PREFIX = "redis:lock:flow:task:";//流程节点锁
     public static final String REDIS_LOCK_EXAM_TASK_FLOW_PREFIX = "redis:lock:exam:task:flow:";//考试任务流程节点锁
+    public static final String REDIS_LOCK_PAPER_NUMBER_PREFIX = "redis:lock:paper:number:";//试卷编号锁
     public static final long REDIS_LOCK_FLOW_TASK_TIME_OUT = 60L * 2;
     public static final long REDIS_LOCK_EXAM_TASK_FLOW_TIME_OUT = 60L * 2;
     public static final String REDIS_LOCK_FLOW_PREFIX = "redis:lock:flow:";//流程锁
@@ -447,6 +448,7 @@ public class SystemConstant {
     public static final long REDIS_LOCK_CUSTOM_FLOW_TIME_OUT = 60L * 2;
     public static final String REDIS_LOCK_CALCULATE_PREFIX = "redis:lock:calculate:";//计算锁
     public static final long REDIS_LOCK_CALCULATE_TIME_OUT = 60L * 60;
+    public static final long REDIS_LOCK_PAPER_NUMBER_TIME_OUT = 60L * 2;
 
     /**
      * 机器心跳