Ver código fonte

修改后台生成评卷任务规则

处于试评阶段的评卷分组,也会开始生成正评评卷任务,但MarkGroup的几个count字段保持试评阶段逻辑,切换到正评时才刷新为正评任务统计数量
luoshi 5 anos atrás
pai
commit
8711516803

+ 1 - 1
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/MarkGroupService.java

@@ -57,6 +57,6 @@ public interface MarkGroupService {
 
     long countByExamAndStatus(Integer examId, MarkStatus... status);
 
-    boolean validateStatus(Integer examId, String subjectCode, Integer number, MarkStatus status);
+    boolean validateStatus(Integer examId, String subjectCode, Integer number, MarkStatus... status);
 
 }

+ 3 - 6
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/MarkGroupServiceImpl.java

@@ -39,9 +39,7 @@ public class MarkGroupServiceImpl extends BaseQueryService<MarkGroup> implements
     @Override
     public void updatePicList(int examId, String subjectCode, int number, List<PictureConfigItem> configList) {
         groupDao.updatePicList(examId, subjectCode, number,
-                configList != null && configList.size() > 0
-                        ? StringUtils.join(configList, PictureConfigItem.DB_ITEM_JOINER)
-                        : "");
+                configList != null && configList.size() > 0 ? StringUtils.join(configList, PictureConfigItem.DB_ITEM_JOINER) : "");
     }
 
     @Transactional
@@ -82,8 +80,7 @@ public class MarkGroupServiceImpl extends BaseQueryService<MarkGroup> implements
 
     @Transactional
     @Override
-    public boolean updateStatus(int examId, String subjectCode, Integer number, MarkStatus newStatus,
-            MarkStatus... currentStatus) {
+    public boolean updateStatus(int examId, String subjectCode, Integer number, MarkStatus newStatus, MarkStatus... currentStatus) {
         return groupDao.updateStatus(examId, subjectCode, number, newStatus, currentStatus) > 0;
     }
 
@@ -160,7 +157,7 @@ public class MarkGroupServiceImpl extends BaseQueryService<MarkGroup> implements
     }
 
     @Override
-    public boolean validateStatus(Integer examId, String subjectCode, Integer number, MarkStatus status) {
+    public boolean validateStatus(Integer examId, String subjectCode, Integer number, MarkStatus... status) {
         return groupDao.countByExamIdAndSubjectCodeAndNumberAndStatus(examId, subjectCode, number, status) > 0;
     }
 

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

@@ -31,9 +31,8 @@ import cn.com.qmth.stmms.common.enums.MarkStatus;
 
 /**
  * 与评卷相关的所有定时任务
- * 
- * @author luoshi
  *
+ * @author luoshi
  */
 @Component
 public class MarkCronService {
@@ -96,7 +95,7 @@ public class MarkCronService {
     public void buildLibrary() {
         log.info("start auto-create library");
         try {
-            Map<String, Campus> campusMap = new HashMap<String, Campus>();
+            Map<String, Campus> campusMap = new HashMap<>();
             List<Integer> examIds = groupService.findExamIdByStatus(MarkStatus.TRIAL, MarkStatus.FORMAL);
             for (Integer examId : examIds) {
                 buildLibraryByExam(examId, campusMap);
@@ -130,11 +129,9 @@ public class MarkCronService {
         // 获取主观题总分大于0的科目
         List<ExamSubject> subjects = subjectService.list(examId, 0);
         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) {
-                List<Marker> markers = markerService.findByExamAndSubjectAndGroup(examId, subject.getCode(),
-                        markGroup.getNumber());
+                List<Marker> markers = markerService.findByExamAndSubjectAndGroup(examId, subject.getCode(), markGroup.getNumber());
                 for (Marker marker : markers) {
                     try {
                         markService.updateQuality(marker);
@@ -151,8 +148,7 @@ public class MarkCronService {
         List<ExamSubject> subjects = subjectService.listSubjectiveScore(examId, 0d);
         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) {
                 for (ExamStudent student : list) {
                     try {
@@ -166,25 +162,26 @@ public class MarkCronService {
                 }
             }
             // 处理正常考生
-            // 生成正评任务
-            List<MarkGroup> groups = groupService.findByExamAndSubjectAndStatus(subject.getExamId(), subject.getCode(),
-                    MarkStatus.FORMAL);
-            for (MarkGroup group : groups) {
-                buildFormalLibrary(subject, campusMap, group);
-            }
             // 生成试评任务
-            groups = groupService.findByExamAndSubjectAndStatus(subject.getExamId(), subject.getCode(),
-                    MarkStatus.TRIAL);
+            List<MarkGroup> groups = groupService.findByExamAndSubjectAndStatus(subject.getExamId(), subject.getCode(), MarkStatus.TRIAL);
             for (MarkGroup group : groups) {
                 buildTrialLibrary(campusMap, group);
             }
+            // 生成正评任务
+            // 试评状态的分组也提前生成
+            groups = groupService
+                    .findByExamAndSubjectAndStatus(subject.getExamId(), subject.getCode(), MarkStatus.FORMAL, MarkStatus.TRIAL);
+            for (MarkGroup group : groups) {
+                buildFormalLibrary(subject, campusMap, group);
+            }
         }
     }
 
     private void buildFormalLibrary(ExamSubject subject, Map<String, Campus> campusMap, MarkGroup group) {
         Date lastBuildTime = group.getBuildTime();
-        ExamStudent student = studentService.findUnLibraryStudent(group.getExamId(), group.getSubjectCode(),
-                group.getNumber(), lastBuildTime);
+        int count = 0;
+        ExamStudent student = studentService
+                .findUnLibraryStudent(group.getExamId(), group.getSubjectCode(), group.getNumber(), lastBuildTime);
         while (student != null) {
             // 补充学习中心集合
             Campus campus = getCampus(student, campusMap);
@@ -196,35 +193,40 @@ public class MarkCronService {
             try {
                 lockService.watch(LockType.GROUP, group.getExamId(), group.getSubjectCode(), group.getNumber());
                 lockService.watch(LockType.STUDENT, student.getId());
-                // 上锁后重新验证状态
-                if (!groupService.validateStatus(group.getExamId(), group.getSubjectCode(), group.getNumber(),
-                        MarkStatus.FORMAL)) {
-                    return;
+                // 上锁后重复验证分组状态
+                if (!groupService.validateStatus(group.getExamId(), group.getSubjectCode(), group.getNumber(), MarkStatus.FORMAL,
+                        MarkStatus.TRIAL)) {
+                    break;
                 }
+                // 上锁后重复验证考生状态
                 if (studentService.validateStatus(student.getId())) {
                     markService.buildFormalLibrary(student, campus, group, subject);
-                    markService.updateLibraryCount(group);
-                    markService.updateMarkedCount(group);
                     lastBuildTime = student.getUploadTime();
+                    count++;
                 }
             } 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 {
                 lockService.unwatch(LockType.STUDENT, student.getId());
                 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) {
+            group = groupService.findOne(group.getExamId(), group.getSubjectCode(), group.getNumber());
+            if (group.getStatus() == MarkStatus.FORMAL) {
+                markService.updateLibraryCount(group);
+                markService.updateMarkedCount(group);
+            }
         }
     }
 
     private void buildTrialLibrary(Map<String, Campus> campusMap, MarkGroup group) {
         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) {
                 return;
             }
@@ -238,19 +240,18 @@ public class MarkCronService {
             try {
                 lockService.watch(LockType.GROUP, group.getExamId(), group.getSubjectCode(), group.getNumber());
                 lockService.watch(LockType.STUDENT, student.getId());
-                // 上锁后重新验证状态
-                if (!groupService.validateStatus(group.getExamId(), group.getSubjectCode(), group.getNumber(),
-                        MarkStatus.TRIAL)) {
-                    return;
+                // 上锁后重新验证分组状态
+                if (!groupService.validateStatus(group.getExamId(), group.getSubjectCode(), group.getNumber(), MarkStatus.TRIAL)) {
+                    break;
                 }
+                // 上锁后重复验证考生状态
                 if (studentService.validateStatus(student.getId())) {
                     markService.buildTrialLibrary(student, campus, group);
                     markService.updateLibraryCount(group);
                     markService.updateMarkedCount(group);
                 }
             } 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 {
                 lockService.unwatch(LockType.STUDENT, student.getId());
                 lockService.unwatch(LockType.GROUP, group.getExamId(), group.getSubjectCode(), group.getNumber());