Browse Source

优化绑定班级情况下的评卷员领取任务逻辑,直接采用SQL过滤模式,省去程序读取班级set的步骤

luoshi 6 năm trước cách đây
mục cha
commit
bcc07a643d

+ 4 - 5
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/dao/MarkLibraryDao.java

@@ -27,13 +27,12 @@ public interface MarkLibraryDao extends JpaRepository<MarkLibrary, Integer>, Jpa
             + "and not exists (select l2 from MarkLibrary l2 where l2.studentId=l1.studentId and l2.id!=l1.id and l2.markerId=?4)")
     List<MarkLibrary> findUnMarked(Integer examId, String subjectCode, Integer groupNumber, Integer markerId,
             Set<LibraryStatus> statusSet, Pageable page);
-    
+
     @Query("select l1 from MarkLibrary l1 where l1.examId=?1 and l1.subjectCode=?2 and l1.groupNumber=?3 and l1.status in (?5) "
             + "and not exists (select l2 from MarkLibrary l2 where l2.studentId=l1.studentId and l2.id!=l1.id and l2.markerId=?4) "
-            + "and exists (select l3 from MarkLibrary l3,ExamStudent s where l3.studentId=l1.studentId and l3.studentId=s.id and s.className in (?6) "
-                            + " and l3.examId=?1 and l3.subjectCode=?2 and l3.groupNumber=?3) ")
-    List<MarkLibrary> findUnMarked(Integer examId, String subjectCode, Integer groupNumber, Integer markerId,
-            Set<LibraryStatus> statusSet,Set<String> className, Pageable page);
+            + "and exists (select mc.id from MarkerClass mc, ExamStudent s where l1.studentId=s.id and mc.markerId=?4 and s.className=mc.className)")
+    List<MarkLibrary> findUnMarkedFilterClass(Integer examId, String subjectCode, Integer groupNumber, Integer markerId,
+            Set<LibraryStatus> statusSet, Pageable page);
 
     List<MarkLibrary> findByMarkerId(Integer markerId);
 

+ 13 - 25
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/MarkLibraryServiceImpl.java

@@ -46,7 +46,7 @@ public class MarkLibraryServiceImpl extends BaseQueryService<MarkLibrary> implem
 
     @Override
     public List<MarkLibrary> findUnMarked(Integer examId, String subjectCode, Integer groupNumber, Integer markerId,
-            int pageNumber, int pageSize) {
+            boolean filterClass, int pageNumber, int pageSize) {
         Set<LibraryStatus> statusSet = new HashSet<>();
         statusSet.add(LibraryStatus.WAITING);
 
@@ -54,7 +54,9 @@ public class MarkLibraryServiceImpl extends BaseQueryService<MarkLibrary> implem
         query.setPageNumber(pageNumber);
         query.setPageSize(pageSize);
 
-        return libraryDao.findUnMarked(examId, subjectCode, groupNumber, markerId, statusSet, query);
+        return filterClass
+                ? libraryDao.findUnMarkedFilterClass(examId, subjectCode, groupNumber, markerId, statusSet, query)
+                : libraryDao.findUnMarked(examId, subjectCode, groupNumber, markerId, statusSet, query);
     }
 
     @Override
@@ -120,7 +122,7 @@ public class MarkLibraryServiceImpl extends BaseQueryService<MarkLibrary> implem
                 if (StringUtils.isNotBlank(query.getExamNumber())) {
                     predicates.add(cb.equal(root.get("examNumber"), query.getExamNumber()));
                 }
-                if (query.getStudentId()!=null ) {
+                if (query.getStudentId() != null) {
                     predicates.add(cb.equal(root.get("studentId"), query.getStudentId()));
                 }
                 if (query.getMarkerId() > 0) {
@@ -139,7 +141,7 @@ public class MarkLibraryServiceImpl extends BaseQueryService<MarkLibrary> implem
                 if (query.getTagId() > 0) {
                     predicates.add(cb.like(root.get("tags").as(String.class), "%" + query.getTagId() + "%"));
                 }
-                if (query.getMarkerScore()!=null ) {
+                if (query.getMarkerScore() != null) {
                     predicates.add(cb.equal(root.get("markerScore"), query.getMarkerScore()));
                 }
                 return predicates.isEmpty() ? cb.conjunction()
@@ -153,29 +155,15 @@ public class MarkLibraryServiceImpl extends BaseQueryService<MarkLibrary> implem
         return libraryDao.findByStudentIdAndStatus(studentId, status);
     }
 
-	@Override
-	public List<Object[]> findScoreCount(int examId, String subjectCode,
-			Integer groupNumber, Integer id, LibraryStatus status) {
-		return libraryDao.findScoreCount(examId, subjectCode, groupNumber, id, status);
-	}
-	
-	@Override
-	public List<Double> findScore(int examId, String subjectCode,
-			Integer groupNumber, LibraryStatus status) {
-		return libraryDao.findScore(examId, subjectCode, groupNumber, status);
-	}
-
     @Override
-    public List<MarkLibrary> findUnMarked(Integer examId, String subjectCode, Integer groupNumber, Set<String> classSet,
-            Integer markerId, int pageNumber, int pageSize) {
-        Set<LibraryStatus> statusSet = new HashSet<>();
-        statusSet.add(LibraryStatus.WAITING);
-
-        MarkLibrarySearchQuery query = new MarkLibrarySearchQuery();
-        query.setPageNumber(pageNumber);
-        query.setPageSize(pageSize);
+    public List<Object[]> findScoreCount(int examId, String subjectCode, Integer groupNumber, Integer id,
+            LibraryStatus status) {
+        return libraryDao.findScoreCount(examId, subjectCode, groupNumber, id, status);
+    }
 
-        return libraryDao.findUnMarked(examId, subjectCode, groupNumber, markerId, statusSet,classSet, query);
+    @Override
+    public List<Double> findScore(int examId, String subjectCode, Integer groupNumber, LibraryStatus status) {
+        return libraryDao.findScore(examId, subjectCode, groupNumber, status);
     }
 
 }

+ 3 - 5
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/MarkLibraryService.java

@@ -1,7 +1,6 @@
 package cn.com.qmth.stmms.biz.mark.service;
 
 import java.util.List;
-import java.util.Set;
 
 import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
 import cn.com.qmth.stmms.biz.mark.query.MarkLibrarySearchQuery;
@@ -18,7 +17,7 @@ public interface MarkLibraryService {
     MarkLibrarySearchQuery findByQuery(MarkLibrarySearchQuery query);
 
     List<MarkLibrary> findUnMarked(Integer examId, String subjectCode, Integer groupNumber, Integer markerId,
-            int pageNumber, int pageSize);
+            boolean filterClass, int pageNumber, int pageSize);
 
     long countByExamAndSubjectAndGroupAndStatus(int examId, String subjectCode, int groupNumber, LibraryStatus status);
 
@@ -32,10 +31,9 @@ public interface MarkLibraryService {
 
     List<MarkLibrary> findByStudentIdAndStatus(int studentId, LibraryStatus status);
 
-    List<Object[]> findScoreCount(int examId, String subjectCode, Integer groupNumber, Integer id, LibraryStatus status);
+    List<Object[]> findScoreCount(int examId, String subjectCode, Integer groupNumber, Integer id,
+            LibraryStatus status);
 
     List<Double> findScore(int examId, String subjectCode, Integer groupNumber, LibraryStatus status);
 
-    List<MarkLibrary> findUnMarked(Integer examId, String subjectCode, Integer groupNumber, Set<String> classSet,
-            Integer markerId, int pageNumber, int pageSize);
 }

+ 11 - 29
stmms-web/src/main/java/cn/com/qmth/stmms/mark/MarkController.java

@@ -3,13 +3,9 @@ package cn.com.qmth.stmms.mark;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
-import java.util.Set;
 
 import javax.servlet.http.HttpServletRequest;
 
-import net.sf.json.JSONArray;
-import net.sf.json.JSONObject;
-
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -31,10 +27,8 @@ 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.model.Tag;
 import cn.com.qmth.stmms.biz.exam.service.ExamService;
-import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
 import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
 import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
-import cn.com.qmth.stmms.biz.exam.service.MarkerClassService;
 import cn.com.qmth.stmms.biz.exam.service.MarkerService;
 import cn.com.qmth.stmms.biz.exam.service.TagService;
 import cn.com.qmth.stmms.biz.lock.LockService;
@@ -54,6 +48,8 @@ import cn.com.qmth.stmms.common.enums.LockType;
 import cn.com.qmth.stmms.common.enums.MarkMode;
 import cn.com.qmth.stmms.common.enums.MarkStatus;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
+import net.sf.json.JSONArray;
+import net.sf.json.JSONObject;
 
 @Controller
 @RequestMapping("/mark")
@@ -91,12 +87,6 @@ public class MarkController extends BaseController {
     @Autowired
     private LockService lockService;
 
-    @Autowired
-    private ExamStudentService studentService;
-
-    @Autowired
-    private MarkerClassService classService;
-
     @Value("${slice.image.server}")
     private String sliceServer;
 
@@ -162,7 +152,8 @@ public class MarkController extends BaseController {
                 markerService.save(marker);
             }
         }
-        ModelAndView view = new ModelAndView(mode == MarkMode.TRACK ? "modules/mark/markTrack" : "modules/mark/markNew");
+        ModelAndView view = new ModelAndView(
+                mode == MarkMode.TRACK ? "modules/mark/markTrack" : "modules/mark/markNew");
         view.addObject("forceMode", forceMode);
         view.addObject("sheetView", group.isSheetView());
         return view;
@@ -254,16 +245,12 @@ public class MarkController extends BaseController {
     public Task getTask(HttpServletRequest request) {
         Marker marker = RequestUtils.getWebUser(request).getMarker();
         Task task = null;
-        Set<String> classes = null;
-        if (marker.getClassCount() != 0) {
-            classes = classService.findClassNameByMarkerId(marker.getId());
-        }
         try {
             lockService.watch(LockType.GROUP, marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
             lockService.watch(LockType.MARKER, marker.getId());
 
-            MarkGroup group = groupService
-                    .findOne(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
+            MarkGroup group = groupService.findOne(marker.getExamId(), marker.getSubjectCode(),
+                    marker.getGroupNumber());
             if (group == null) {
                 task = new Task();
                 task.setExist(false);
@@ -275,7 +262,7 @@ public class MarkController extends BaseController {
             } else if (group.getStatus() == MarkStatus.TRIAL) {
                 task = getTrialTask(marker);
             } else if (group.getStatus() == MarkStatus.FORMAL) {
-                task = getFormalTask(marker, classes);
+                task = getFormalTask(marker);
             }
             if (task == null) {
                 task = new Task();
@@ -291,19 +278,14 @@ public class MarkController extends BaseController {
         return task;
     }
 
-    private Task getFormalTask(Marker marker, Set<String> classes) {
+    private Task getFormalTask(Marker marker) {
         int retry = 1;
         Task task = null;
         while (task == null) {
             List<MarkLibrary> list = new ArrayList<MarkLibrary>();
-            // 绑定了班级的评卷员
-            if (classes != null) {
-                list = libraryService.findUnMarked(marker.getExamId(), marker.getSubjectCode(),
-                        marker.getGroupNumber(), classes, marker.getId(), retry, 20);
-            } else {
-                list = libraryService.findUnMarked(marker.getExamId(), marker.getSubjectCode(),
-                        marker.getGroupNumber(), marker.getId(), retry, 20);
-            }
+            // 需要判断评卷员是否绑定了班级
+            list = libraryService.findUnMarked(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber(),
+                    marker.getId(), marker.getClassCount() != null && marker.getClassCount() > 0, retry, 20);
             if (list.isEmpty()) {
                 break;
             }