浏览代码

修改双评任务判断的随机方法;修改试评任务创建时的比较逻辑

luoshi 6 年之前
父节点
当前提交
e8fc1a8adf

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

@@ -165,18 +165,19 @@ public class MarkCronService {
             }
             // 处理正常考生
             // 生成正评任务
-            buildFormalLibrary(examId, subject.getCode(), campusMap);
+            buildFormalLibrary(subject, campusMap);
             // 生成试评任务
-            buildTrialLibrary(examId, subject.getCode(), campusMap);
+            buildTrialLibrary(subject, campusMap);
         }
     }
 
-    private void buildFormalLibrary(Integer examId, String subjectCode, Map<String, Campus> campusMap) {
-        List<MarkGroup> groups = groupService.findByExamAndSubjectAndStatus(examId, subjectCode, MarkStatus.FORMAL);
+    private void buildFormalLibrary(ExamSubject subject, Map<String, Campus> campusMap) {
+        List<MarkGroup> groups = groupService.findByExamAndSubjectAndStatus(subject.getExamId(), subject.getCode(),
+                MarkStatus.FORMAL);
         for (MarkGroup group : groups) {
             Date lastBuildTime = group.getBuildTime();
-            ExamStudent student = studentService.findUnLibraryStudent(examId, subjectCode, group.getNumber(),
-                    lastBuildTime);
+            ExamStudent student = studentService.findUnLibraryStudent(group.getExamId(), group.getSubjectCode(),
+                    group.getNumber(), lastBuildTime);
             while (student != null) {
                 // 补充学习中心集合
                 Campus campus = getCampus(student, campusMap);
@@ -186,7 +187,7 @@ public class MarkCronService {
                 }
                 // 尝试构造评卷任务
                 try {
-                    markService.buildFormalLibrary(student, campus, group);
+                    markService.buildFormalLibrary(student, campus, group, subject);
                     markService.updateLibraryCount(group);
                     lastBuildTime = student.getUploadTime();
                 } catch (Exception e) {
@@ -194,21 +195,26 @@ public class MarkCronService {
                             + group.getNumber(), e);
                 }
                 // 取下一个考生
-                student = studentService.findUnLibraryStudent(examId, subjectCode, group.getNumber(), lastBuildTime);
+                student = studentService.findUnLibraryStudent(group.getExamId(), group.getSubjectCode(),
+                        group.getNumber(), lastBuildTime);
             }
         }
     }
 
-    private void buildTrialLibrary(Integer examId, String subjectCode, Map<String, Campus> campusMap) {
-        List<MarkGroup> groups = groupService.findByExamAndSubjectAndStatus(examId, subjectCode, MarkStatus.TRIAL);
+    private void buildTrialLibrary(ExamSubject subject, Map<String, Campus> campusMap) {
+        List<MarkGroup> groups = groupService.findByExamAndSubjectAndStatus(subject.getExamId(), subject.getCode(),
+                MarkStatus.TRIAL);
         for (MarkGroup group : groups) {
-            if (group.getLibraryCount() >= group.getTrialCount()) {
-                continue;
-            }
+            // if (group.getLibraryCount() >= group.getTrialCount()) {
+            // continue;
+            // }
 
-            while (groupService.needTrialLibrary(examId, subjectCode, group.getNumber())) {
+            // while (groupService.needTrialLibrary(group.getExamId(),
+            // group.getSubjectCode(), group.getNumber())) {
+            while (group.getTrialCount() > group.getLibraryCount()) {
                 // 随机取一个未生成试评任务的考生
-                ExamStudent student = studentService.randomUnTrialStudent(examId, subjectCode, group.getNumber());
+                ExamStudent student = studentService.randomUnTrialStudent(group.getExamId(), group.getSubjectCode(),
+                        group.getNumber());
                 if (student == null) {
                     break;
                 }

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

@@ -17,6 +17,7 @@ import cn.com.qmth.stmms.biz.exam.dao.MarkGroupDao;
 import cn.com.qmth.stmms.biz.exam.dao.MarkerDao;
 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.Marker;
 import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
@@ -768,13 +769,15 @@ public class MarkServiceImpl implements MarkService {
     @Transactional
     public void updateLibraryCount(MarkGroup group) {
         if (group.getStatus() == MarkStatus.FORMAL) {
+            group.setLibraryCount((int) libraryDao.countByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(),
+                    group.getSubjectCode(), group.getNumber()));
             groupDao.updateLibraryCount(group.getExamId(), group.getSubjectCode(), group.getNumber(),
-                    (int) libraryDao.countByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(),
-                            group.getSubjectCode(), group.getNumber()));
+                    group.getLibraryCount());
         } else if (group.getStatus() == MarkStatus.TRIAL) {
+            group.setLibraryCount((int) trialLibraryDao.countByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(),
+                    group.getSubjectCode(), group.getNumber()));
             groupDao.updateLibraryCount(group.getExamId(), group.getSubjectCode(), group.getNumber(),
-                    (int) trialLibraryDao.countByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(),
-                            group.getSubjectCode(), group.getNumber()));
+                    group.getLibraryCount());
         }
     }
 
@@ -801,10 +804,11 @@ public class MarkServiceImpl implements MarkService {
      * @param student
      * @param campus
      * @param group
+     * @param subject
      */
     @Override
     @Transactional
-    public void buildFormalLibrary(ExamStudent student, Campus campus, MarkGroup group) {
+    public void buildFormalLibrary(ExamStudent student, Campus campus, MarkGroup group, ExamSubject subject) {
         // 等待大题释放锁定
         lockService.waitUnlockGroup(group.getExamId(), group.getSubjectCode(), group.getNumber());
         // 等待考生释放锁定
@@ -827,12 +831,15 @@ public class MarkServiceImpl implements MarkService {
                 if (group.getDoubleRate() == 1) {
                     needDouble = true;
                 } else {
-                    double studentCount = studentService.countUploadedByExamIdAndSubjectCode(group.getExamId(),
-                            group.getSubjectCode());
+                    double studentCount = subject.getUploadCount();
+                    double libraryCount = group.getLibraryCount();
                     double doubleCount = libraryDao.countByExamIdAndSubjectCodeAndGroupNumberAndTaskNumber(
                             group.getExamId(), group.getSubjectCode(), group.getNumber(), 2);
+                    int expectCount = (int) (studentCount * group.getDoubleRate());
                     // 随机数判断加入当前已经生成双评任务的比例加权
-                    needDouble = Math.random() < (group.getDoubleRate() - doubleCount / studentCount);
+                    needDouble = doubleCount < expectCount
+                            && ((studentCount - libraryCount + doubleCount) <= (expectCount - doubleCount)
+                                    || Math.random() < group.getDoubleRate());
                 }
                 if (needDouble) {
                     library = new MarkLibrary();
@@ -850,7 +857,6 @@ public class MarkServiceImpl implements MarkService {
         }
         group.setBuildTime(student.getUploadTime());
         groupDao.updateBuildTime(group.getExamId(), group.getSubjectCode(), group.getNumber(), student.getUploadTime());
-        // updateTotalCount(group);
     }
 
     /**
@@ -877,7 +883,6 @@ public class MarkServiceImpl implements MarkService {
             library.setStudentId(student.getId());
             library.setExamNumber(student.getExamNumber());
             trialLibraryDao.save(library);
-            // updateTotalCount(group);
         }
     }
 

+ 3 - 1
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/MarkService.java

@@ -4,6 +4,7 @@ import java.util.List;
 
 import cn.com.qmth.stmms.biz.campus.model.Campus;
 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.Marker;
 import cn.com.qmth.stmms.biz.mark.model.ArbitrateHistory;
@@ -183,8 +184,9 @@ public interface MarkService {
      * @param student
      * @param campus
      * @param group
+     * @param subject
      */
-    void buildFormalLibrary(ExamStudent student, Campus campus, MarkGroup group);
+    void buildFormalLibrary(ExamStudent student, Campus campus, MarkGroup group, ExamSubject subject);
 
     /**
      * 根据考生、学习中心、大题构造试评评卷任务