Browse Source

修改生成双评任务逻辑,随机数判断规则加入当前已生成双评任务的比例加权

luoshi 6 years ago
parent
commit
305567a797

+ 8 - 6
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/dao/MarkLibraryDao.java

@@ -41,6 +41,10 @@ public interface MarkLibraryDao extends JpaRepository<MarkLibrary, Integer>, Jpa
     @Query("select count(*) from MarkLibrary f where f.examId=?1 and f.subjectCode=?2 and f.groupNumber=?3")
     @Query("select count(*) from MarkLibrary f where f.examId=?1 and f.subjectCode=?2 and f.groupNumber=?3")
     long countByExamIdAndSubjectCodeAndGroupNumber(Integer examId, String subjectCode, Integer groupNumber);
     long countByExamIdAndSubjectCodeAndGroupNumber(Integer examId, String subjectCode, Integer groupNumber);
 
 
+    @Query("select count(*) from MarkLibrary f where f.examId=?1 and f.subjectCode=?2 and f.groupNumber=?3 and f.taskNumber=?4")
+    long countByExamIdAndSubjectCodeAndGroupNumberAndTaskNumber(Integer examId, String subjectCode, Integer groupNumber,
+            Integer taskNumber);
+
     @Query("select count(*) from MarkLibrary f where f.examId=?1 and f.subjectCode=?2 and f.groupNumber=?3 and f.status in (?4)")
     @Query("select count(*) from MarkLibrary f where f.examId=?1 and f.subjectCode=?2 and f.groupNumber=?3 and f.status in (?4)")
     long countByExamIdAndSubjectCodeAndGroupNumberAndStatus(Integer examId, String subjectCode, Integer groupNumber,
     long countByExamIdAndSubjectCodeAndGroupNumberAndStatus(Integer examId, String subjectCode, Integer groupNumber,
             LibraryStatus... status);
             LibraryStatus... status);
@@ -114,12 +118,10 @@ public interface MarkLibraryDao extends JpaRepository<MarkLibrary, Integer>, Jpa
             String markerScoreList, Date markerTime, Integer spent, String tags, LibraryStatus... previousStatus);
             String markerScoreList, Date markerTime, Integer spent, String tags, LibraryStatus... previousStatus);
 
 
     @Query("select m.markerScore ,count(*) from MarkLibrary m where m.examId=?1 and m.subjectCode=?2 and m.groupNumber=?3 and m.markerId=?4 and m.status=?5 group by m.markerScore ")
     @Query("select m.markerScore ,count(*) from MarkLibrary m where m.examId=?1 and m.subjectCode=?2 and m.groupNumber=?3 and m.markerId=?4 and m.status=?5 group by m.markerScore ")
-	List<Object[]> findScoreCount(int examId, String subjectCode,
-			Integer groupNumber, Integer markerId, LibraryStatus status);
-	
-    @Query("select m.markerScore from MarkLibrary m where m.examId=?1 and m.subjectCode=?2 and m.groupNumber=?3 and m.status=?4 group by m.markerScore ")
-	List<Double> findScore(int examId, String subjectCode,
-			Integer groupNumber, LibraryStatus status);
+    List<Object[]> findScoreCount(int examId, String subjectCode, Integer groupNumber, Integer markerId,
+            LibraryStatus status);
 
 
+    @Query("select m.markerScore from MarkLibrary m where m.examId=?1 and m.subjectCode=?2 and m.groupNumber=?3 and m.status=?4 group by m.markerScore ")
+    List<Double> findScore(int examId, String subjectCode, Integer groupNumber, LibraryStatus status);
 
 
 }
 }

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

@@ -59,10 +59,10 @@ public class MarkCronService {
 
 
     @Autowired
     @Autowired
     private MemoryLockProvider memoryLock;
     private MemoryLockProvider memoryLock;
-    
+
     @Autowired
     @Autowired
     private MarkerService markerService;
     private MarkerService markerService;
-    
+
     @Value("${mark.cleanTimeoutMinute}")
     @Value("${mark.cleanTimeoutMinute}")
     private long timeoutMinute;
     private long timeoutMinute;
 
 
@@ -110,7 +110,7 @@ public class MarkCronService {
             log.debug("finish auto-create library");
             log.debug("finish auto-create library");
         }
         }
     }
     }
-    
+
     /**
     /**
      * 定时生成评卷任务
      * 定时生成评卷任务
      */
      */
@@ -130,26 +130,28 @@ public class MarkCronService {
     }
     }
 
 
     private void updateMarkerByExam(Integer examId) {
     private void updateMarkerByExam(Integer examId) {
-    	// 获取主观题总分大于0的科目
-    	List<ExamSubject> subjects = subjectService.list(examId, 0);
+        // 获取主观题总分大于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);
-        	for (MarkGroup markGroup : groups) {
-        		if(!MarkStatus.FINISH.equals(markGroup.getStatus())){
-                    	List<Marker> markers = markerService.findByExamAndSubjectAndGroup(examId, subject.getCode(), markGroup.getNumber());
-                       for (Marker marker : markers) {
-                           try {
-                               markService.updateQuality(marker);
-                           } catch (Exception e) {
-                               log.error("update marker quality error for markerId="+marker.getId(), e);
-                           }
-                       }
-        		}
-			}
+            List<MarkGroup> groups = groupService.findByExamAndSubjectAndStatus(examId, subject.getCode(),
+                    MarkStatus.FORMAL);
+            for (MarkGroup markGroup : groups) {
+                if (!MarkStatus.FINISH.equals(markGroup.getStatus())) {
+                    List<Marker> markers = markerService.findByExamAndSubjectAndGroup(examId, subject.getCode(),
+                            markGroup.getNumber());
+                    for (Marker marker : markers) {
+                        try {
+                            markService.updateQuality(marker);
+                        } catch (Exception e) {
+                            log.error("update marker quality error for markerId=" + marker.getId(), e);
+                        }
+                    }
+                }
+            }
         }
         }
-	}
+    }
 
 
-	private void buildLibraryByExam(Integer examId, Map<String, Campus> campusMap) {
+    private void buildLibraryByExam(Integer examId, Map<String, Campus> campusMap) {
         // 获取主观题总分大于0的科目
         // 获取主观题总分大于0的科目
         List<ExamSubject> subjects = subjectService.list(examId, 0);
         List<ExamSubject> subjects = subjectService.list(examId, 0);
         for (ExamSubject subject : subjects) {
         for (ExamSubject subject : subjects) {
@@ -185,6 +187,7 @@ public class MarkCronService {
                 // 尝试构造评卷任务
                 // 尝试构造评卷任务
                 try {
                 try {
                     markService.buildFormalLibrary(student, campus, group);
                     markService.buildFormalLibrary(student, campus, group);
+                    markService.updateTotalCount(group);
                     lastBuildTime = student.getUploadTime();
                     lastBuildTime = student.getUploadTime();
                 } catch (Exception e) {
                 } catch (Exception e) {
                     log.error("build formal library error for studentId=" + student.getId() + ", groupNumber="
                     log.error("build formal library error for studentId=" + student.getId() + ", groupNumber="
@@ -206,8 +209,8 @@ public class MarkCronService {
             while (groupService.needTrialLibrary(examId, subjectCode, group.getNumber())) {
             while (groupService.needTrialLibrary(examId, subjectCode, group.getNumber())) {
                 // 随机取一个未生成试评任务的考生
                 // 随机取一个未生成试评任务的考生
                 ExamStudent student = studentService.randomUnTrialStudent(examId, subjectCode, group.getNumber());
                 ExamStudent student = studentService.randomUnTrialStudent(examId, subjectCode, group.getNumber());
-                if(student==null){
-                	break;
+                if (student == null) {
+                    break;
                 }
                 }
                 // 补充学习中心集合
                 // 补充学习中心集合
                 Campus campus = getCampus(student, campusMap);
                 Campus campus = getCampus(student, campusMap);
@@ -218,6 +221,7 @@ public class MarkCronService {
                 // 尝试构造试评任务
                 // 尝试构造试评任务
                 try {
                 try {
                     markService.buildTrialLibrary(student, campus, group);
                     markService.buildTrialLibrary(student, campus, group);
+                    markService.updateTotalCount(group);
                 } catch (Exception e) {
                 } catch (Exception e) {
                     log.error("build trial library error for studentId=" + student.getId() + ", groupNumber="
                     log.error("build trial library error for studentId=" + student.getId() + ", groupNumber="
                             + group.getNumber(), e);
                             + group.getNumber(), e);

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

@@ -229,7 +229,7 @@ public class MarkServiceImpl implements MarkService {
             groupDao.delete(group);
             groupDao.delete(group);
             // 科目总分
             // 科目总分
             subjectService.updateScore(group.getExamId(), group.getSubjectCode(), false,
             subjectService.updateScore(group.getExamId(), group.getSubjectCode(), false,
-            		sumTotalScore(group.getExamId(), group.getSubjectCode()));
+                    sumTotalScore(group.getExamId(), group.getSubjectCode()));
         } catch (Exception e) {
         } catch (Exception e) {
             throw e;
             throw e;
         } finally {
         } finally {
@@ -650,9 +650,9 @@ public class MarkServiceImpl implements MarkService {
         double totalScore = 0.0;
         double totalScore = 0.0;
         // 循环所有大题
         // 循环所有大题
         for (MarkGroup group : groups) {
         for (MarkGroup group : groups) {
-        	if(group.getStatus().equals(MarkStatus.TRIAL)){
-        		return ;
-        	}
+            if (group.getStatus().equals(MarkStatus.TRIAL)) {
+                return;
+            }
             if (calculateGroup(group, studentId)) {
             if (calculateGroup(group, studentId)) {
                 totalScore += group.getMarkScore();
                 totalScore += group.getMarkScore();
                 scoreList.addAll(group.getMarkScoreDetail());
                 scoreList.addAll(group.getMarkScoreDetail());
@@ -672,8 +672,8 @@ public class MarkServiceImpl implements MarkService {
         // 未设置算分策略的情况下,默认取平均分
         // 未设置算分策略的情况下,默认取平均分
         ScorePolicy policy = group.getScorePolicy() != null ? group.getScorePolicy() : ScorePolicy.AVG;
         ScorePolicy policy = group.getScorePolicy() != null ? group.getScorePolicy() : ScorePolicy.AVG;
         List<MarkLibrary> list = libraryDao.findByStudentIdAndGroupNumber(studentId, group.getNumber());
         List<MarkLibrary> list = libraryDao.findByStudentIdAndGroupNumber(studentId, group.getNumber());
-        if(list.isEmpty()){
-        	return false;
+        if (list.isEmpty()) {
+            return false;
         }
         }
         for (MarkLibrary library : list) {
         for (MarkLibrary library : list) {
             if (library.getStatus() != LibraryStatus.MARKED && library.getStatus() != LibraryStatus.ARBITRATED) {
             if (library.getStatus() != LibraryStatus.MARKED && library.getStatus() != LibraryStatus.ARBITRATED) {
@@ -761,14 +761,14 @@ public class MarkServiceImpl implements MarkService {
     public void updateLibraryCount(MarkGroup group) {
     public void updateLibraryCount(MarkGroup group) {
         if (group.getStatus() == MarkStatus.FORMAL) {
         if (group.getStatus() == MarkStatus.FORMAL) {
             groupDao.updateMarkedCount(group.getExamId(), group.getSubjectCode(), group.getNumber(),
             groupDao.updateMarkedCount(group.getExamId(), group.getSubjectCode(), group.getNumber(),
-            		(int) libraryDao.countByExamIdAndSubjectCodeAndGroupNumberAndStatus(group.getExamId(),
+                    (int) libraryDao.countByExamIdAndSubjectCodeAndGroupNumberAndStatus(group.getExamId(),
                             group.getSubjectCode(), group.getNumber(), LibraryStatus.MARKED, LibraryStatus.ARBITRATED));
                             group.getSubjectCode(), group.getNumber(), LibraryStatus.MARKED, LibraryStatus.ARBITRATED));
         } else if (group.getStatus() == MarkStatus.TRIAL) {
         } else if (group.getStatus() == MarkStatus.TRIAL) {
             groupDao.updateMarkedCount(group.getExamId(), group.getSubjectCode(), group.getNumber(),
             groupDao.updateMarkedCount(group.getExamId(), group.getSubjectCode(), group.getNumber(),
-                     (int) trialLibraryDao.countMarked(group.getExamId(), group.getSubjectCode(), group.getNumber()));
+                    (int) trialLibraryDao.countMarked(group.getExamId(), group.getSubjectCode(), group.getNumber()));
         }
         }
     }
     }
-    
+
     /**
     /**
      * 更新某个大题评卷任务数量
      * 更新某个大题评卷任务数量
      * 
      * 
@@ -778,13 +778,16 @@ public class MarkServiceImpl implements MarkService {
     @Transactional
     @Transactional
     public void updateTotalCount(MarkGroup group) {
     public void updateTotalCount(MarkGroup group) {
         if (group.getStatus() == MarkStatus.FORMAL) {
         if (group.getStatus() == MarkStatus.FORMAL) {
-            groupDao.updateLibraryCount(group.getExamId(), group.getSubjectCode(), group.getNumber(),
-                    (int) libraryDao.countByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(),
-                            group.getSubjectCode(), group.getNumber()));
+            group.setLibraryCount((int) libraryDao.countByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(),
+                    group.getSubjectCode(), group.getNumber()));
         } else if (group.getStatus() == MarkStatus.TRIAL) {
         } else if (group.getStatus() == MarkStatus.TRIAL) {
+            group.setLibraryCount((int) trialLibraryDao.countByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(),
+                    group.getSubjectCode(), group.getNumber()));
+        }
+        if (group.getStatus() == MarkStatus.TRIAL || group.getStatus() == MarkStatus.FORMAL) {
+            group.setLeftCount(group.getLibraryCount() - group.getMarkedCount());
             groupDao.updateLibraryCount(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());
         }
         }
     }
     }
 
 
@@ -831,23 +834,36 @@ public class MarkServiceImpl implements MarkService {
             library.setTaskNumber(1);
             library.setTaskNumber(1);
             library.setStatus(LibraryStatus.WAITING);
             library.setStatus(LibraryStatus.WAITING);
             libraryDao.save(library);
             libraryDao.save(library);
-            // 开启双评,且随机数超过双评比例,生成第二份评卷任务
-            if (group.getDoubleRate() != null && group.getDoubleRate() > Math.random()) {
-                library = new MarkLibrary();
-                library.setExamId(student.getExamId());
-                library.setSubjectCode(student.getSubjectCode());
-                library.setGroupNumber(group.getNumber());
-                library.setCampusId(campus.getId());
-                library.setStudentId(student.getId());
-                library.setExamNumber(student.getExamNumber());
-                library.setTaskNumber(2);
-                library.setStatus(LibraryStatus.WAITING);
-                libraryDao.save(library);
+            // 开启双评时需要判断是否生成第二份评卷任务
+            if (group.getDoubleRate() != null && group.getDoubleRate() > 0) {
+                boolean needDouble = false;
+                if (group.getDoubleRate() == 1) {
+                    needDouble = true;
+                } else {
+                    double studentCount = studentService.countUploadedByExamIdAndSubjectCode(group.getExamId(),
+                            group.getSubjectCode());
+                    double doubleCount = libraryDao.countByExamIdAndSubjectCodeAndGroupNumberAndTaskNumber(
+                            group.getExamId(), group.getSubjectCode(), group.getNumber(), 2);
+                    // 随机数判断加入当前已经生成双评任务的比例加权
+                    needDouble = Math.random() < (group.getDoubleRate() - doubleCount / studentCount);
+                }
+                if (needDouble) {
+                    library = new MarkLibrary();
+                    library.setExamId(student.getExamId());
+                    library.setSubjectCode(student.getSubjectCode());
+                    library.setGroupNumber(group.getNumber());
+                    library.setCampusId(campus.getId());
+                    library.setStudentId(student.getId());
+                    library.setExamNumber(student.getExamNumber());
+                    library.setTaskNumber(2);
+                    library.setStatus(LibraryStatus.WAITING);
+                    libraryDao.save(library);
+                }
             }
             }
         }
         }
         group.setBuildTime(student.getUploadTime());
         group.setBuildTime(student.getUploadTime());
         groupDao.updateBuildTime(group.getExamId(), group.getSubjectCode(), group.getNumber(), student.getUploadTime());
         groupDao.updateBuildTime(group.getExamId(), group.getSubjectCode(), group.getNumber(), student.getUploadTime());
-        updateTotalCount(group);
+        // updateTotalCount(group);
     }
     }
 
 
     /**
     /**
@@ -874,7 +890,7 @@ public class MarkServiceImpl implements MarkService {
             library.setStudentId(student.getId());
             library.setStudentId(student.getId());
             library.setExamNumber(student.getExamNumber());
             library.setExamNumber(student.getExamNumber());
             trialLibraryDao.save(library);
             trialLibraryDao.save(library);
-            updateTotalCount(group);
+            // updateTotalCount(group);
         }
         }
     }
     }
 
 
@@ -953,14 +969,15 @@ public class MarkServiceImpl implements MarkService {
 
 
             sumScore += score;
             sumScore += score;
             sumSpent += spent;
             sumSpent += spent;
-            if(finishCount>0){
-            	avgScore = sumScore / finishCount;
-            	avgSpent = sumSpent / finishCount;
-            	// 递归法计算标准差
-            	if(finishCount-1!=0){
-            		tempScore = tempScore + 1.0 * (finishCount - 1) / finishCount * (score - avgScore) * (score - avgScore);
-            		stdevScore = Math.sqrt(tempScore / (finishCount - 1));
-            	}
+            if (finishCount > 0) {
+                avgScore = sumScore / finishCount;
+                avgSpent = sumSpent / finishCount;
+                // 递归法计算标准差
+                if (finishCount - 1 != 0) {
+                    tempScore = tempScore
+                            + 1.0 * (finishCount - 1) / finishCount * (score - avgScore) * (score - avgScore);
+                    stdevScore = Math.sqrt(tempScore / (finishCount - 1));
+                }
             }
             }
         }
         }
         markerDao.updateQualityById(marker.getId(), finishCount, validCount, avgSpent / 1000, avgScore, stdevScore);
         markerDao.updateQualityById(marker.getId(), finishCount, validCount, avgSpent / 1000, avgScore, stdevScore);

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

@@ -145,7 +145,7 @@ public interface MarkService {
      * @param group
      * @param group
      */
      */
     void updateLibraryCount(MarkGroup group);
     void updateLibraryCount(MarkGroup group);
-    
+
     /**
     /**
      * 更新某个大题评卷任务总数量
      * 更新某个大题评卷任务总数量
      * 
      *