소스 검색

更新锁卷逻辑,修复评卷页面拖拽问题,间隔分不能为0

ting.yin 4 년 전
부모
커밋
1975082071

+ 36 - 37
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/MarkCronService.java

@@ -1,5 +1,15 @@
 package cn.com.qmth.stmms.biz.mark.service.Impl;
 package cn.com.qmth.stmms.biz.mark.service.Impl;
 
 
+import java.util.Date;
+import java.util.List;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
@@ -10,19 +20,9 @@ import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
 import cn.com.qmth.stmms.biz.exam.service.MarkerService;
 import cn.com.qmth.stmms.biz.exam.service.MarkerService;
 import cn.com.qmth.stmms.biz.lock.LockService;
 import cn.com.qmth.stmms.biz.lock.LockService;
 import cn.com.qmth.stmms.biz.mark.service.MarkService;
 import cn.com.qmth.stmms.biz.mark.service.MarkService;
-import cn.com.qmth.stmms.biz.utils.FormalTaskUtil;
-import cn.com.qmth.stmms.biz.utils.TrialTaskUtil;
+import cn.com.qmth.stmms.biz.utils.TaskLockUtil;
 import cn.com.qmth.stmms.common.enums.LockType;
 import cn.com.qmth.stmms.common.enums.LockType;
 import cn.com.qmth.stmms.common.enums.MarkStatus;
 import cn.com.qmth.stmms.common.enums.MarkStatus;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.scheduling.annotation.Scheduled;
-import org.springframework.stereotype.Component;
-
-import java.util.Date;
-import java.util.List;
 
 
 /**
 /**
  * 与评卷相关的所有定时任务
  * 与评卷相关的所有定时任务
@@ -76,8 +76,7 @@ public class MarkCronService {
     @Scheduled(cron = "${mark.cleanTaskSchedule}")
     @Scheduled(cron = "${mark.cleanTaskSchedule}")
     public void cronCleanTask() {
     public void cronCleanTask() {
         try {
         try {
-            FormalTaskUtil.clearTimeoutTask(timeoutMinute);
-            TrialTaskUtil.clearTimeoutTask(timeoutMinute);
+            TaskLockUtil.clearTimeoutTask(timeoutMinute);
         } catch (Exception e) {
         } catch (Exception e) {
             log.error("CronCleanTask error", e);
             log.error("CronCleanTask error", e);
         }
         }
@@ -123,11 +122,11 @@ public class MarkCronService {
         // 获取主观题总分大于0的科目
         // 获取主观题总分大于0的科目
         List<ExamSubject> subjects = subjectService.list(examId, 0);
         List<ExamSubject> subjects = subjectService.list(examId, 0);
         for (ExamSubject subject : subjects) {
         for (ExamSubject subject : subjects) {
-            List<MarkGroup> groups = groupService
-                    .findByExamAndSubjectAndStatus(examId, subject.getCode(), MarkStatus.FORMAL);
+            List<MarkGroup> groups = groupService.findByExamAndSubjectAndStatus(examId, subject.getCode(),
+                    MarkStatus.FORMAL);
             for (MarkGroup markGroup : groups) {
             for (MarkGroup markGroup : groups) {
-                List<Marker> markers = markerService
-                        .findByExamAndSubjectAndGroup(examId, subject.getCode(), markGroup.getNumber());
+                List<Marker> markers = markerService.findByExamAndSubjectAndGroup(examId, subject.getCode(),
+                        markGroup.getNumber());
                 for (Marker marker : markers) {
                 for (Marker marker : markers) {
                     try {
                     try {
                         if (markService.needUpdateQuality(marker, markerActiveExpireMinute)) {
                         if (markService.needUpdateQuality(marker, markerActiveExpireMinute)) {
@@ -147,8 +146,8 @@ public class MarkCronService {
         List<ExamSubject> subjects = subjectService.listSubjectiveScore(examId, 0d);
         List<ExamSubject> subjects = subjectService.listSubjectiveScore(examId, 0d);
         for (ExamSubject subject : subjects) {
         for (ExamSubject subject : subjects) {
             // 清除缺考考生和违纪考生
             // 清除缺考考生和违纪考生
-            List<ExamStudent> list = studentService
-                    .findAbsentOrBreachLibraryStudent(subject.getExamId(), subject.getCode());
+            List<ExamStudent> list = studentService.findAbsentOrBreachLibraryStudent(subject.getExamId(),
+                    subject.getCode());
             if (list != null) {
             if (list != null) {
                 for (ExamStudent student : list) {
                 for (ExamStudent student : list) {
                     try {
                     try {
@@ -163,16 +162,15 @@ public class MarkCronService {
             }
             }
             // 处理正常考生
             // 处理正常考生
             // 生成试评任务
             // 生成试评任务
-            List<MarkGroup> groups = groupService
-                    .findByExamAndSubjectAndStatus(subject.getExamId(), subject.getCode(), MarkStatus.TRIAL);
+            List<MarkGroup> groups = groupService.findByExamAndSubjectAndStatus(subject.getExamId(), subject.getCode(),
+                    MarkStatus.TRIAL);
             for (MarkGroup group : groups) {
             for (MarkGroup group : groups) {
                 buildTrialLibrary(group);
                 buildTrialLibrary(group);
             }
             }
             // 生成正评任务
             // 生成正评任务
             // 试评状态的分组也提前生成
             // 试评状态的分组也提前生成
-            groups = groupService
-                    .findByExamAndSubjectAndStatus(subject.getExamId(), subject.getCode(), MarkStatus.FORMAL,
-                            MarkStatus.TRIAL);
+            groups = groupService.findByExamAndSubjectAndStatus(subject.getExamId(), subject.getCode(),
+                    MarkStatus.FORMAL, MarkStatus.TRIAL);
             for (MarkGroup group : groups) {
             for (MarkGroup group : groups) {
                 buildFormalLibrary(subject, group);
                 buildFormalLibrary(subject, group);
             }
             }
@@ -182,17 +180,16 @@ public class MarkCronService {
     private void buildFormalLibrary(ExamSubject subject, MarkGroup group) {
     private void buildFormalLibrary(ExamSubject subject, MarkGroup group) {
         Date lastBuildTime = group.getBuildTime();
         Date lastBuildTime = group.getBuildTime();
         int count = 0;
         int count = 0;
-        ExamStudent student = studentService
-                .findUnLibraryStudent(group.getExamId(), group.getSubjectCode(), group.getNumber(), lastBuildTime);
+        ExamStudent student = studentService.findUnLibraryStudent(group.getExamId(), group.getSubjectCode(),
+                group.getNumber(), lastBuildTime);
         while (student != null) {
         while (student != null) {
             // 尝试构造评卷任务
             // 尝试构造评卷任务
             try {
             try {
                 lockService.watch(LockType.GROUP, group.getExamId(), group.getSubjectCode(), group.getNumber());
                 lockService.watch(LockType.GROUP, group.getExamId(), group.getSubjectCode(), group.getNumber());
                 lockService.watch(LockType.STUDENT, student.getId());
                 lockService.watch(LockType.STUDENT, student.getId());
                 // 上锁后重复验证分组状态
                 // 上锁后重复验证分组状态
-                if (!groupService
-                        .validateStatus(group.getExamId(), group.getSubjectCode(), group.getNumber(), MarkStatus.FORMAL,
-                                MarkStatus.TRIAL)) {
+                if (!groupService.validateStatus(group.getExamId(), group.getSubjectCode(), group.getNumber(),
+                        MarkStatus.FORMAL, MarkStatus.TRIAL)) {
                     break;
                     break;
                 }
                 }
                 // 上锁后重复验证考生状态
                 // 上锁后重复验证考生状态
@@ -202,15 +199,16 @@ public class MarkCronService {
                     count++;
                     count++;
                 }
                 }
             } catch (Exception e) {
             } catch (Exception e) {
-                log.error("build formal library error for studentId=" + student.getId() + ", groupNumber=" + group
-                        .getNumber(), e);
+                log.error(
+                        "build formal library error for studentId=" + student.getId() + ", groupNumber="
+                                + group.getNumber(), e);
             } finally {
             } finally {
                 lockService.unwatch(LockType.STUDENT, student.getId());
                 lockService.unwatch(LockType.STUDENT, student.getId());
                 lockService.unwatch(LockType.GROUP, group.getExamId(), group.getSubjectCode(), group.getNumber());
                 lockService.unwatch(LockType.GROUP, group.getExamId(), group.getSubjectCode(), group.getNumber());
             }
             }
             // 取下一个考生
             // 取下一个考生
-            student = studentService
-                    .findUnLibraryStudent(group.getExamId(), group.getSubjectCode(), group.getNumber(), lastBuildTime);
+            student = studentService.findUnLibraryStudent(group.getExamId(), group.getSubjectCode(), group.getNumber(),
+                    lastBuildTime);
         }
         }
         // 有新任务创建,同时正评状态,此时才需要更新任务数量
         // 有新任务创建,同时正评状态,此时才需要更新任务数量
         if (count > 0) {
         if (count > 0) {
@@ -225,8 +223,8 @@ public class MarkCronService {
     private void buildTrialLibrary(MarkGroup group) {
     private void buildTrialLibrary(MarkGroup group) {
         while (group.getTrialCount() > group.getLibraryCount()) {
         while (group.getTrialCount() > group.getLibraryCount()) {
             // 随机取一个未生成试评任务的考生
             // 随机取一个未生成试评任务的考生
-            ExamStudent student = studentService
-                    .randomUnTrialStudent(group.getExamId(), group.getSubjectCode(), group.getNumber());
+            ExamStudent student = studentService.randomUnTrialStudent(group.getExamId(), group.getSubjectCode(),
+                    group.getNumber());
             if (student == null) {
             if (student == null) {
                 return;
                 return;
             }
             }
@@ -246,8 +244,9 @@ public class MarkCronService {
                     markService.updateMarkedCount(group);
                     markService.updateMarkedCount(group);
                 }
                 }
             } catch (Exception e) {
             } catch (Exception e) {
-                log.error("build trial library error for studentId=" + student.getId() + ", groupNumber=" + group
-                        .getNumber(), e);
+                log.error(
+                        "build trial library error for studentId=" + student.getId() + ", groupNumber="
+                                + group.getNumber(), e);
             } finally {
             } finally {
                 lockService.unwatch(LockType.STUDENT, student.getId());
                 lockService.unwatch(LockType.STUDENT, student.getId());
                 lockService.unwatch(LockType.GROUP, group.getExamId(), group.getSubjectCode(), group.getNumber());
                 lockService.unwatch(LockType.GROUP, group.getExamId(), group.getSubjectCode(), group.getNumber());

+ 96 - 32
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/MarkServiceImpl.java

@@ -1,17 +1,11 @@
 package cn.com.qmth.stmms.biz.mark.service.Impl;
 package cn.com.qmth.stmms.biz.mark.service.Impl;
 
 
-import cn.com.qmth.stmms.biz.exam.dao.*;
-import cn.com.qmth.stmms.biz.exam.model.*;
-import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
-import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
-import cn.com.qmth.stmms.biz.mark.dao.*;
-import cn.com.qmth.stmms.biz.mark.model.*;
-import cn.com.qmth.stmms.biz.mark.query.MarkLibrarySearchQuery;
-import cn.com.qmth.stmms.biz.mark.service.MarkService;
-import cn.com.qmth.stmms.biz.utils.FormalTaskUtil;
-import cn.com.qmth.stmms.biz.utils.ScoreItem;
-import cn.com.qmth.stmms.biz.utils.TrialTaskUtil;
-import cn.com.qmth.stmms.common.enums.*;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 
 
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
@@ -21,12 +15,47 @@ import org.springframework.data.domain.Sort;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
 
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
+import cn.com.qmth.stmms.biz.exam.dao.ExamQuestionDao;
+import cn.com.qmth.stmms.biz.exam.dao.MarkGroupDao;
+import cn.com.qmth.stmms.biz.exam.dao.MarkGroupStudentDao;
+import cn.com.qmth.stmms.biz.exam.dao.MarkerDao;
+import cn.com.qmth.stmms.biz.exam.dao.SubjectiveScoreDao;
+import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
+import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
+import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
+import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
+import cn.com.qmth.stmms.biz.exam.model.MarkGroupStudent;
+import cn.com.qmth.stmms.biz.exam.model.Marker;
+import cn.com.qmth.stmms.biz.exam.model.SubjectiveScore;
+import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
+import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
+import cn.com.qmth.stmms.biz.mark.dao.ArbitrateHistoryDao;
+import cn.com.qmth.stmms.biz.mark.dao.MarkLibraryDao;
+import cn.com.qmth.stmms.biz.mark.dao.MarkSpecialTagDao;
+import cn.com.qmth.stmms.biz.mark.dao.MarkTrackDao;
+import cn.com.qmth.stmms.biz.mark.dao.ProblemHistoryDao;
+import cn.com.qmth.stmms.biz.mark.dao.TrialHistoryDao;
+import cn.com.qmth.stmms.biz.mark.dao.TrialLibraryDao;
+import cn.com.qmth.stmms.biz.mark.dao.TrialTagDao;
+import cn.com.qmth.stmms.biz.mark.dao.TrialTrackDao;
+import cn.com.qmth.stmms.biz.mark.model.ArbitrateHistory;
+import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
+import cn.com.qmth.stmms.biz.mark.model.MarkResult;
+import cn.com.qmth.stmms.biz.mark.model.MarkTrack;
+import cn.com.qmth.stmms.biz.mark.model.ProblemHistory;
+import cn.com.qmth.stmms.biz.mark.model.TrialHistory;
+import cn.com.qmth.stmms.biz.mark.model.TrialLibrary;
+import cn.com.qmth.stmms.biz.mark.query.MarkLibrarySearchQuery;
+import cn.com.qmth.stmms.biz.mark.service.MarkService;
+import cn.com.qmth.stmms.biz.utils.ScoreItem;
+import cn.com.qmth.stmms.biz.utils.TaskLock;
+import cn.com.qmth.stmms.biz.utils.TaskLockUtil;
+import cn.com.qmth.stmms.common.enums.HistoryStatus;
+import cn.com.qmth.stmms.common.enums.LibraryStatus;
+import cn.com.qmth.stmms.common.enums.MarkStatus;
+import cn.com.qmth.stmms.common.enums.ScorePolicy;
+import cn.com.qmth.stmms.common.enums.SubjectiveStatus;
+import cn.com.qmth.stmms.common.enums.ThirdPolicy;
 
 
 /**
 /**
  * 与评卷相关的所有修改操作(非传播性的新增操作除外),全部汇总到这里进行集中控制
  * 与评卷相关的所有修改操作(非传播性的新增操作除外),全部汇总到这里进行集中控制
@@ -99,9 +128,11 @@ public class MarkServiceImpl implements MarkService {
     public int applyCount(MarkGroup group) {
     public int applyCount(MarkGroup group) {
         int count = 0;
         int count = 0;
         if (group.getStatus() == MarkStatus.TRIAL) {
         if (group.getStatus() == MarkStatus.TRIAL) {
-            count = TrialTaskUtil.count(group.getExamId(), group.getSubjectCode(), group.getNumber());
+            TaskLock taskLock = TaskLockUtil.getTrialTask(getGroupKey(group));
+            count = taskLock.count();
         } else if (group.getStatus() == MarkStatus.FORMAL) {
         } else if (group.getStatus() == MarkStatus.FORMAL) {
-            count = FormalTaskUtil.count(group.getExamId(), group.getSubjectCode(), group.getNumber());
+            TaskLock taskLock = TaskLockUtil.getFormalTask(getGroupKey(group));
+            count = taskLock.count();
         }
         }
         return count;
         return count;
     }
     }
@@ -121,9 +152,11 @@ public class MarkServiceImpl implements MarkService {
         }
         }
         if (group != null) {
         if (group != null) {
             if (group.getStatus() == MarkStatus.FORMAL) {
             if (group.getStatus() == MarkStatus.FORMAL) {
-                return FormalTaskUtil.count(marker);
+                TaskLock taskLock = TaskLockUtil.getFormalTask(getGroupKey(marker));
+                return taskLock.count(marker);
             } else if (group.getStatus() == MarkStatus.TRIAL) {
             } else if (group.getStatus() == MarkStatus.TRIAL) {
-                return TrialTaskUtil.count(marker);
+                TaskLock taskLock = TaskLockUtil.getTrialTask(getGroupKey(marker));
+                return taskLock.count(marker);
             }
             }
         }
         }
         return 0;
         return 0;
@@ -162,9 +195,13 @@ public class MarkServiceImpl implements MarkService {
     @Override
     @Override
     public void releaseByGroup(MarkGroup group) {
     public void releaseByGroup(MarkGroup group) {
         if (group.getStatus() == MarkStatus.TRIAL) {
         if (group.getStatus() == MarkStatus.TRIAL) {
-            TrialTaskUtil.clear(group.getExamId(), group.getSubjectCode(), group.getNumber());
+            TaskLock taskLock = TaskLockUtil.getTrialTask(getGroupKey(group));
+            taskLock.clear();
+            TaskLockUtil.addTrialTask(getGroupKey(group), taskLock);
         } else if (group.getStatus() == MarkStatus.FORMAL) {
         } else if (group.getStatus() == MarkStatus.FORMAL) {
-            FormalTaskUtil.clear(group.getExamId(), group.getSubjectCode(), group.getNumber());
+            TaskLock taskLock = TaskLockUtil.getFormalTask(getGroupKey(group));
+            taskLock.clear();
+            TaskLockUtil.addFormalTask(getGroupKey(group), taskLock);
         }
         }
     }
     }
 
 
@@ -280,7 +317,13 @@ public class MarkServiceImpl implements MarkService {
         // marker.getId()) > 0) {
         // marker.getId()) > 0) {
         // return false;
         // return false;
         // }
         // }
-        return FormalTaskUtil.add(marker, getApplyTaskId(library));
+        // return FormalTaskUtil.add(marker, getApplyTaskId(library));
+        TaskLock taskLock = TaskLockUtil.getFormalTask(getGroupKey(marker));
+        if (taskLock.add(getApplyTaskId(library), library.getTaskNumber(), marker)) {
+            TaskLockUtil.addFormalTask(getGroupKey(marker), taskLock);
+            return true;
+        }
+        return false;
     }
     }
 
 
     /**
     /**
@@ -294,7 +337,12 @@ public class MarkServiceImpl implements MarkService {
      */
      */
     @Override
     @Override
     public boolean applyLibrary(TrialLibrary library, Marker marker) {
     public boolean applyLibrary(TrialLibrary library, Marker marker) {
-        return TrialTaskUtil.add(marker, getApplyTaskId(library, marker));
+        TaskLock taskLock = TaskLockUtil.getTrialTask(getGroupKey(marker));
+        if (taskLock.add(getApplyTaskId(library, marker), 1, marker)) {
+            TaskLockUtil.addTrialTask(getGroupKey(marker), taskLock);
+            return true;
+        }
+        return false;
     }
     }
 
 
     /**
     /**
@@ -308,7 +356,8 @@ public class MarkServiceImpl implements MarkService {
      */
      */
     @Override
     @Override
     public boolean hasApplied(MarkLibrary library, Marker marker) {
     public boolean hasApplied(MarkLibrary library, Marker marker) {
-        return FormalTaskUtil.exists(marker, getApplyTaskId(library));
+        TaskLock taskLock = TaskLockUtil.getFormalTask(getGroupKey(marker));
+        return taskLock.exist(getApplyTaskId(library), library.getTaskNumber(), marker);
     }
     }
 
 
     /**
     /**
@@ -322,7 +371,8 @@ public class MarkServiceImpl implements MarkService {
      */
      */
     @Override
     @Override
     public boolean hasApplied(TrialLibrary library, Marker marker) {
     public boolean hasApplied(TrialLibrary library, Marker marker) {
-        return TrialTaskUtil.exists(marker, getApplyTaskId(library, marker));
+        TaskLock taskLock = TaskLockUtil.getTrialTask(getGroupKey(marker));
+        return taskLock.exist(getApplyTaskId(library, marker), 1, marker);
     }
     }
 
 
     /**
     /**
@@ -335,7 +385,10 @@ public class MarkServiceImpl implements MarkService {
      */
      */
     @Override
     @Override
     public void releaseLibrary(MarkLibrary library, Marker marker) {
     public void releaseLibrary(MarkLibrary library, Marker marker) {
-        FormalTaskUtil.remove(marker, getApplyTaskId(library));
+        TaskLock taskLock = TaskLockUtil.getFormalTask(getGroupKey(marker));
+        taskLock.remove(getApplyTaskId(library), library.getTaskNumber(), marker);
+        taskLock.refresh(marker);
+        TaskLockUtil.addFormalTask(getGroupKey(marker), taskLock);
     }
     }
 
 
     /**
     /**
@@ -348,7 +401,9 @@ public class MarkServiceImpl implements MarkService {
      */
      */
     @Override
     @Override
     public void releaseLibrary(TrialLibrary library, Marker marker) {
     public void releaseLibrary(TrialLibrary library, Marker marker) {
-        TrialTaskUtil.remove(marker, getApplyTaskId(library, marker));
+        TaskLock taskLock = TaskLockUtil.getTrialTask(getGroupKey(marker));
+        taskLock.remove(getApplyTaskId(library, marker), 1, marker);
+        TaskLockUtil.addTrialTask(getGroupKey(marker), taskLock);
     }
     }
 
 
     /**
     /**
@@ -359,8 +414,9 @@ public class MarkServiceImpl implements MarkService {
      */
      */
     @Override
     @Override
     public void releaseByMarker(Marker marker) {
     public void releaseByMarker(Marker marker) {
-        FormalTaskUtil.clear(marker);
-        TrialTaskUtil.clear(marker);
+        TaskLock taskLock = TaskLockUtil.getFormalTask(getGroupKey(marker));
+        taskLock.clear(marker);
+        TaskLockUtil.addFormalTask(getGroupKey(marker), taskLock);
     }
     }
 
 
     /**
     /**
@@ -1109,6 +1165,14 @@ public class MarkServiceImpl implements MarkService {
         return library.getId() + "_" + marker.getId();
         return library.getId() + "_" + marker.getId();
     }
     }
 
 
+    private String getGroupKey(MarkGroup group) {
+        return group.getExamId() + "_" + group.getSubjectCode() + "_" + group.getNumber();
+    }
+
+    private String getGroupKey(Marker marker) {
+        return marker.getExamId() + "_" + marker.getSubjectCode() + "_" + marker.getGroupNumber();
+    }
+
     /**
     /**
      * 重置评卷分组的连带操作
      * 重置评卷分组的连带操作
      *
      *

+ 54 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/utils/TaskLockUtil.java

@@ -0,0 +1,54 @@
+package cn.com.qmth.stmms.biz.utils;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class TaskLockUtil {
+
+    // 评卷任务并发处理互斥锁
+    private static Map<String, TaskLock> formalTaskMap = new ConcurrentHashMap<>();
+
+    // 试评任务并发处理互斥锁
+    private static Map<String, TaskLock> trialTaskMap = new ConcurrentHashMap<>();
+
+    public static void clearTimeoutTask(long timeoutMinute) {
+        synchronized (TaskLockUtil.class) {
+            if (formalTaskMap.size() > 0) {
+                for (String key : formalTaskMap.keySet()) {
+                    TaskLock taskLock = formalTaskMap.get(key);
+                    if (taskLock != null) {
+                        taskLock.clear(timeoutMinute);
+                    }
+                }
+            }
+            if (trialTaskMap.size() > 0) {
+                for (String key : trialTaskMap.keySet()) {
+                    TaskLock taskLock = trialTaskMap.get(key);
+                    if (taskLock != null) {
+                        taskLock.clear(timeoutMinute);
+                    }
+                }
+            }
+        }
+    }
+
+    public static TaskLock getTrialTask(String key) {
+        return trialTaskMap.get(key) == null ? new TaskLock() : trialTaskMap.get(key);
+    }
+
+    public static TaskLock getFormalTask(String key) {
+        return formalTaskMap.get(key) == null ? new TaskLock() : formalTaskMap.get(key);
+    }
+
+    public static void addFormalTask(String key, TaskLock value) {
+        synchronized (TaskLockUtil.class) {
+            formalTaskMap.put(key, value);
+        }
+    }
+
+    public static void addTrialTask(String key, TaskLock value) {
+        synchronized (TaskLockUtil.class) {
+            trialTaskMap.put(key, value);
+        }
+    }
+}

+ 1 - 1
stmms-web/src/main/java/cn/com/qmth/stmms/admin/dto/SubjectiveQuestionDTO.java

@@ -73,7 +73,7 @@ public class SubjectiveQuestionDTO implements QuestionDTO {
                 : 0d);
                 : 0d);
         setScorePolicy(group != null && group.getScorePolicy() != null ? group.getScorePolicy().getValue()
         setScorePolicy(group != null && group.getScorePolicy() != null ? group.getScorePolicy().getValue()
                 : ScorePolicy.AVG.getValue());
                 : ScorePolicy.AVG.getValue());
-        setMarkMode(group != null && group.getMarkMode() != null ? group.getMarkMode().getName() : "");
+        setMarkMode(group != null && group.getMarkMode() != null ? group.getMarkMode().toString() : "");
         setTrialCount(group != null && group.getTrialCount() != null ? group.getTrialCount() : 0);
         setTrialCount(group != null && group.getTrialCount() != null ? group.getTrialCount() : 0);
     }
     }
 
 

+ 1 - 10
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/InspectedController.java

@@ -208,6 +208,7 @@ public class InspectedController extends BaseExamController {
         List<Integer> ids = new ArrayList<Integer>();
         List<Integer> ids = new ArrayList<Integer>();
         ExamStudent student = studentService.findById(studentId);
         ExamStudent student = studentService.findById(studentId);
         if (student != null && student.getSubjectiveStatus().equals(SubjectiveStatus.MARKED)) {
         if (student != null && student.getSubjectiveStatus().equals(SubjectiveStatus.MARKED)) {
+            releaseTask(studentId);
             ids.add(studentId);
             ids.add(studentId);
         }
         }
         view.addObject("inspectCount", ids.size());
         view.addObject("inspectCount", ids.size());
@@ -261,19 +262,9 @@ public class InspectedController extends BaseExamController {
                 groupArray.add(group);
                 groupArray.add(group);
             }
             }
             result.accumulate("groups", groupArray);
             result.accumulate("groups", groupArray);
-            // MarkGroup group = groupService.findOne(student.getExamId(),
-            // student.getSubjectCode(),
-            // library.getGroupNumber());
             List<String> picUrls = fileService.getSliceUris(student.getExamId(), student.getSecretNumber(), 1,
             List<String> picUrls = fileService.getSliceUris(student.getExamId(), student.getSecretNumber(), 1,
                     student.getSliceCount());
                     student.getSliceCount());
-            // List<MarkTrack> markTracks =
-            // markTrackService.findByLibraryId(library.getId());
-            // List<MarkSpecialTag> markSpecialTagList =
-            // markSpecialTagService.findByLibraryId(library.getId());
             result.accumulate("picUrls", picUrls);
             result.accumulate("picUrls", picUrls);
-            // result.accumulate("pictureConfig", group.getPictureConfigList());
-            // result.accumulate("markTracks", markTracks);
-            // result.accumulate("markSpecialTagList", markSpecialTagList);
             result.accumulate("success", true);
             result.accumulate("success", true);
         } else {
         } else {
             result.accumulate("success", false);
             result.accumulate("success", false);

+ 12 - 8
stmms-web/src/main/java/cn/com/qmth/stmms/monitor/TaskMonitorController.java

@@ -5,6 +5,7 @@ import java.util.Set;
 
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequest;
 
 
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RequestParam;
@@ -12,6 +13,8 @@ import org.springframework.web.bind.annotation.ResponseBody;
 
 
 import cn.com.qmth.stmms.biz.utils.FormalTaskUtil;
 import cn.com.qmth.stmms.biz.utils.FormalTaskUtil;
 import cn.com.qmth.stmms.biz.utils.TaskEntry;
 import cn.com.qmth.stmms.biz.utils.TaskEntry;
+import cn.com.qmth.stmms.biz.utils.TaskLock;
+import cn.com.qmth.stmms.biz.utils.TaskLockUtil;
 import cn.com.qmth.stmms.common.utils.DateUtils;
 import cn.com.qmth.stmms.common.utils.DateUtils;
 import net.sf.json.JSONArray;
 import net.sf.json.JSONArray;
 import net.sf.json.JSONObject;
 import net.sf.json.JSONObject;
@@ -24,15 +27,16 @@ public class TaskMonitorController {
     @ResponseBody
     @ResponseBody
     public Object list(HttpServletRequest request, @RequestParam Integer examId, @RequestParam String subjectCode,
     public Object list(HttpServletRequest request, @RequestParam Integer examId, @RequestParam String subjectCode,
             @RequestParam Integer groupNumber) {
             @RequestParam Integer groupNumber) {
-        Set<TaskEntry> set = FormalTaskUtil.list(examId, subjectCode, groupNumber);
+        TaskLock taskLock = TaskLockUtil.getFormalTask(examId + "_" + subjectCode + "_" + groupNumber);
         JSONArray array = new JSONArray();
         JSONArray array = new JSONArray();
-        for (TaskEntry entry : set) {
-            JSONObject obj = new JSONObject();
-            obj.accumulate("taskId", entry.getTaskId());
-            obj.accumulate("markerId", entry.getMarkerId());
-            obj.accumulate("time", DateUtils.formatDateTime(new Date(entry.getTimestamp())));
-            array.add(obj);
-        }
+        // for (TaskEntry entry : set) {
+        // JSONObject obj = new JSONObject();
+        // obj.accumulate("taskId", entry.getTaskId());
+        // obj.accumulate("markerId", entry.getMarkerId());
+        // obj.accumulate("time", DateUtils.formatDateTime(new
+        // Date(entry.getTimestamp())));
+        // array.add(obj);
+        // }
         return array;
         return array;
     }
     }
 
 

+ 2 - 2
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/groupEditSimple.jsp

@@ -158,7 +158,7 @@
         var fill = true;
         var fill = true;
         $('.interval-score-input').each(function () {
         $('.interval-score-input').each(function () {
             var score = $(this).val();
             var score = $(this).val();
-            if (score == '') {
+            if (score == '' || score<=0) {
                 fill = false;
                 fill = false;
             } else {
             } else {
                 array.push(score);
                 array.push(score);
@@ -168,7 +168,7 @@
             $('#intervalScoreList').val(array.join(','));
             $('#intervalScoreList').val(array.join(','));
             $('#inputForm').submit();
             $('#inputForm').submit();
         } else {
         } else {
-            alert('间隔分不能为空');
+            alert('间隔分不能为空且大于0');
         }
         }
     });
     });
 </script>
 </script>

+ 1 - 1
stmms-web/src/main/webapp/WEB-INF/views/modules/mark/markNew.jsp

@@ -41,7 +41,7 @@
     <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/problem-process.js"></script>
     <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/problem-process.js"></script>
     <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/switch-group.js"></script>
     <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/switch-group.js"></script>
 </head>
 </head>
-<body>
+<body ondragstart="return false;" ondrop="return false;">
 <div class="container-fluid" id="container"></div>
 <div class="container-fluid" id="container"></div>
 <script type="text/javascript">
 <script type="text/javascript">
     $(document).ajaxError(function (evt, req, settings) {
     $(document).ajaxError(function (evt, req, settings) {

+ 1 - 1
stmms-web/src/main/webapp/WEB-INF/views/modules/mark/markTrack.jsp

@@ -34,7 +34,7 @@
     <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/problem-process.js"></script>
     <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/problem-process.js"></script>
     <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/switch-group.js"></script>
     <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/switch-group.js"></script>
 </head>
 </head>
-<body>
+<body ondragstart="return false;" ondrop="return false;">
 <div class="container-fluid" id="container"></div>
 <div class="container-fluid" id="container"></div>
 <script type="text/javascript">
 <script type="text/javascript">
     $(document).ajaxError(function (evt, req, settings) {
     $(document).ajaxError(function (evt, req, settings) {