浏览代码

修复同时提交统分问题

ting.yin 4 年之前
父节点
当前提交
99aa5ab148

+ 17 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/InspectedService.java

@@ -0,0 +1,17 @@
+package cn.com.qmth.stmms.biz.exam.service;
+
+import java.util.List;
+
+import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
+import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
+import cn.com.qmth.stmms.common.enums.SubjectiveStatus;
+
+public interface InspectedService {
+
+    List<ExamStudent> findByQuery(ExamStudentSearchQuery query, SubjectiveStatus status, Integer mainNumber,
+            Double mainStartScore, Double mainEndScore, Double questionScore);
+
+    Integer countByQuery(ExamStudentSearchQuery query, SubjectiveStatus status, Integer mainNumber,
+            Double mainStartScore, Double mainEndScore, Double questionScore);
+
+}

+ 136 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/InspectedServiceImpl.java

@@ -0,0 +1,136 @@
+package cn.com.qmth.stmms.biz.exam.service.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import cn.com.qmth.stmms.biz.common.BaseQueryService;
+import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
+import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
+import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
+import cn.com.qmth.stmms.biz.exam.service.InspectedService;
+import cn.com.qmth.stmms.common.enums.SubjectiveStatus;
+
+@Service
+public class InspectedServiceImpl extends BaseQueryService<ExamStudent> implements InspectedService {
+
+    @PersistenceContext
+    private EntityManager entityManager;
+
+    @Autowired
+    private ExamStudentService studentService;
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public List<ExamStudent> findByQuery(ExamStudentSearchQuery query, SubjectiveStatus status, Integer mainNumber,
+            Double mainStartScore, Double mainEndScore, Double questionScore) {
+        StringBuilder dataSql = new StringBuilder("select distinct s.id "
+                + " from eb_exam_student s left join eb_subjective_score e on e.student_id = s.id ");
+        StringBuilder limitSql = new StringBuilder(" limit :offset,:pageSize");
+        Query dataQuery = getQuery(query, status, mainNumber, mainStartScore, mainEndScore, questionScore, dataSql,
+                limitSql);
+        dataQuery.setParameter("offset", (query.getPageNumber() - 1) * query.getPageSize());
+        dataQuery.setParameter("pageSize", query.getPageSize());
+        List<Integer> list = dataQuery.getResultList();
+        List<ExamStudent> resultList = new ArrayList<ExamStudent>();
+        if (list != null && !list.isEmpty()) {
+            for (Integer id : list) {
+                ExamStudent e = studentService.findById(id);
+                resultList.add(e);
+            }
+        }
+        return resultList;
+
+    }
+
+    private Query getQuery(ExamStudentSearchQuery query, SubjectiveStatus status, Integer mainNumber,
+            Double mainStartScore, Double mainEndScore, Double questionScore, StringBuilder dataSql,
+            StringBuilder limitSql) {
+        StringBuilder whereSql = new StringBuilder(" WHERE s.is_upload = 1 and s.is_absent = 0 and s.is_breach = 0 ");
+        if (query.getExamId() != null) {
+            whereSql.append(" and s.exam_id = :examId");
+        }
+        if (StringUtils.isNotBlank(query.getSubjectCode())) {
+            whereSql.append(" and s.subject_code = :subjectCode");
+        }
+        if (status != null) {
+            whereSql.append(" and s.subjective_status = :status");
+        } else {
+            whereSql.append(" and s.subjective_status IN ('MARKED','INSPECTED')");
+        }
+        if (query.getStartScore() != null) {
+            whereSql.append(" and (s.objective_score+s.subjective_score) >= :startScore");
+        }
+        if (query.getEndScore() != null) {
+            whereSql.append(" and (s.objective_score+s.subjective_score) <= :endScore");
+        }
+        if (mainNumber != null) {
+            whereSql.append(" and e.main_number = :mainNumber");
+        }
+        if (mainStartScore != null) {
+            whereSql.append(" and e.main_score >= :mainStartScore");
+        }
+        if (mainEndScore != null) {
+            whereSql.append(" and e.main_score <= :mainEndScore");
+        }
+        if (questionScore != null) {
+            whereSql.append(" and e.score = :questionScore");
+        }
+        dataSql.append(whereSql);
+        // StringBuilder orderSql = new StringBuilder("order by s.id desc ");
+        // dataSql.append(orderSql);
+        if (limitSql != null) {
+            dataSql.append(limitSql);
+        }
+        Query dataQuery = entityManager.createNativeQuery(dataSql.toString());
+
+        if (query.getExamId() != null) {
+            dataQuery.setParameter("examId", query.getExamId());
+        }
+        if (StringUtils.isNotBlank(query.getSubjectCode())) {
+            dataQuery.setParameter("subjectCode", query.getSubjectCode());
+        }
+        if (status != null) {
+            dataQuery.setParameter("status", status);
+        }
+        if (query.getStartScore() != null) {
+            dataQuery.setParameter("startScore", query.getStartScore());
+        }
+        if (query.getEndScore() != null) {
+            dataQuery.setParameter("endScore", query.getEndScore());
+        }
+        if (mainNumber != null) {
+            dataQuery.setParameter("mainNumber", mainNumber);
+        }
+        if (mainStartScore != null) {
+            dataQuery.setParameter("mainStartScore", mainStartScore);
+        }
+        if (mainEndScore != null) {
+            dataQuery.setParameter("mainEndScore", mainEndScore);
+        }
+        if (questionScore != null) {
+            dataQuery.setParameter("questionScore", questionScore);
+        }
+        return dataQuery;
+    }
+
+    @Override
+    public Integer countByQuery(ExamStudentSearchQuery query, SubjectiveStatus status, Integer mainNumber,
+            Double mainStartScore, Double mainEndScore, Double questionScore) {
+        StringBuilder countSql = new StringBuilder("select count(distinct s.id) "
+                + "from eb_exam_student s left join eb_subjective_score e on e.student_id = s.id ");
+        Query countQuery = getQuery(query, status, mainNumber, mainStartScore, mainEndScore, questionScore, countSql,
+                null);
+        Object singleResult = countQuery.getResultList().get(0);
+        Integer count = singleResult == null ? 0 : Integer.valueOf(singleResult.toString());
+        return count;
+    }
+
+}

+ 15 - 47
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/InspectedController.java

@@ -33,10 +33,10 @@ 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.SubjectiveScore;
 import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
-import cn.com.qmth.stmms.biz.exam.query.SubjectiveScoreSearchQuery;
 import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
 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.InspectedService;
 import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
 import cn.com.qmth.stmms.biz.exam.service.SubjectiveScoreService;
 import cn.com.qmth.stmms.biz.file.service.FileService;
@@ -63,6 +63,9 @@ public class InspectedController extends BaseExamController {
     @Autowired
     private ExamStudentService studentService;
 
+    @Autowired
+    private InspectedService inspectedService;
+
     @Autowired
     private ExamQuestionService questionService;
 
@@ -105,36 +108,18 @@ public class InspectedController extends BaseExamController {
         }
         WebUser wu = RequestUtils.getWebUser(request);
         query.setExamId(examId);
-        query.setUpload(true);
-        query.setAbsent(false);
-        query.setBreach(false);
         List<ExamSubject> subjectList = getExamSubject(examId, wu);
         if (StringUtils.isBlank(query.getSubjectCode()) && !subjectList.isEmpty()) {
             query.setSubjectCode(subjectList.get(0).getCode());
         }
-        if (status != null) {
-            query.addStatus(status);
-        } else {
-            query.addStatus(SubjectiveStatus.INSPECTED);
-            query.addStatus(SubjectiveStatus.MARKED);
-        }
-        if (mainStartScore != null || mainEndScore != null || questionScore != null) {
-            SubjectiveScoreSearchQuery query2 = new SubjectiveScoreSearchQuery();
-            query2.setExamId(examId);
-            query2.setSubjectCode(query.getSubjectCode());
-            query2.setMainNumber(mainNumber);
-            query2.setMainStartScore(mainStartScore);
-            query2.setMainEndScore(mainEndScore);
-            query2.setScore(questionScore);
-            query2.setPageSize(Integer.MAX_VALUE);
-            List<Integer> studentIds = scoreService.findStudentIdByQuery(query2);
-            query.setStudentIds(studentIds);
-        }
-        if (query.getStudentIds() == null || query.getStudentIds().size() != 0) {
-            query = studentService.findByQuery(query);
-        }
+        List<ExamStudent> list = inspectedService.findByQuery(query, status, mainNumber, mainStartScore, mainEndScore,
+                questionScore);
+        Integer count = inspectedService.countByQuery(query, status, mainNumber, mainStartScore, mainEndScore,
+                questionScore);
+        query.setResult(list);
+        query.setTotalCount(count);
         model.addAttribute("query", query);
-        model.addAttribute("inspectCount", query.getTotalCount());
+        model.addAttribute("inspectCount", count);
         model.addAttribute("questionList",
                 questionService.findMainByExamAndSubjectAndObjective(examId, query.getSubjectCode(), false));
         model.addAttribute("mainNumber", mainNumber);
@@ -160,34 +145,17 @@ public class InspectedController extends BaseExamController {
         releaseByUser(wu.getUser().getId());
         ModelAndView view = new ModelAndView("modules/exam/inspected");
         query.setExamId(examId);
-        query.setUpload(true);
-        query.setAbsent(false);
-        query.setBreach(false);
-        query.addStatus(SubjectiveStatus.MARKED);
         query.setPageNumber(1);
         query.setPageSize(Integer.MAX_VALUE);
         List<ExamSubject> subjectList = getExamSubject(examId, wu);
         if (StringUtils.isBlank(query.getSubjectCode()) && !subjectList.isEmpty()) {
             query.setSubjectCode(subjectList.get(0).getCode());
         }
-        if (mainNumber != null || mainStartScore != null || mainEndScore != null || questionScore != null) {
-            SubjectiveScoreSearchQuery query2 = new SubjectiveScoreSearchQuery();
-            query2.setExamId(examId);
-            query2.setSubjectCode(query.getSubjectCode());
-            query2.setMainNumber(mainNumber);
-            query2.setMainStartScore(mainStartScore);
-            query2.setMainEndScore(mainEndScore);
-            query2.setScore(questionScore);
-            query2.setPageSize(Integer.MAX_VALUE);
-            List<Integer> studentIds = scoreService.findStudentIdByQuery(query2);
-            query.setStudentIds(studentIds);
-        }
-        if (query.getStudentIds() == null || query.getStudentIds().size() != 0) {
-            query = studentService.findByQuery(query);
-        }
+        List<ExamStudent> list = inspectedService.findByQuery(query, SubjectiveStatus.MARKED, mainNumber,
+                mainStartScore, mainEndScore, questionScore);
         List<Integer> ids = new ArrayList<Integer>();
-        if (query.getResult() != null && query.getResult().size() > 0) {
-            for (ExamStudent student : query.getResult()) {
+        if (!list.isEmpty()) {
+            for (ExamStudent student : list) {
                 ids.add(student.getId());
             }
         }

+ 2 - 6
stmms-web/src/main/java/cn/com/qmth/stmms/mark/MarkController.java

@@ -447,19 +447,15 @@ public class MarkController extends BaseController {
         try {
             lockService.watch(LockType.EXAM_SUBJECT, marker.getExamId(), marker.getSubjectCode());
             lockService.watch(LockType.GROUP, marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
-            lockService.watch(LockType.STUDENT, markResult.getStudentId());
             lockService.watch(LockType.MARKER, marker.getId());
-            lockService.waitlock(LockType.GROUP_LIBRARY, markResult.getStudentId(), marker.getExamId(),
-                    marker.getSubjectCode(), marker.getGroupNumber());
+            lockService.waitlock(LockType.STUDENT, markResult.getStudentId());
             success = markService.submitTask(markResult, marker);
         } catch (Exception e) {
             success = false;
             log.error("save task error", e);
         } finally {
-            lockService.unlock(LockType.GROUP_LIBRARY, markResult.getStudentId(), marker.getExamId(),
-                    marker.getSubjectCode(), marker.getGroupNumber());
+            lockService.unlock(LockType.STUDENT, markResult.getStudentId());
             lockService.unwatch(LockType.MARKER, marker.getId());
-            lockService.unwatch(LockType.STUDENT, markResult.getStudentId());
             lockService.unwatch(LockType.GROUP, marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
             lockService.unwatch(LockType.EXAM_SUBJECT, marker.getExamId(), marker.getSubjectCode());
         }